1.指針可以這樣理解:
int *ptr; -----> 強調*ptr是一個int類型的指針。
int* ptr; ----->強調的是,int*是一種類型-----指向int的指針。
注意: int* p1,p2; //該聲明創建一個指針p1和一個int變量p2。
2.指針的危險
- 計算機將分配用來存儲地址的內存,但不會分配用來存儲指針所指向的數據的內存。為數據提供空間是一個獨立的步驟,很重要。
long* fellow; *fellow = 123;
/*fellow是一個指針,無指向,該代碼沒有將地址賦給fellow,導致fellow沒有被初始
化,其實就是一個野指針。*/
注意:一定要在對指針應用解除引用運算符(*)之前,將指針初始化為一個確定的、適當的地址。
3.指針與內存
- 指針可不是整型,雖然計算機通常把地址當作整數來處理,整數描述的是可加減乘除的數字,而指針描述的是位置。
- c++使用new來分配內存(c語言中用的是三個loc)
- 程序員要告訴new,需要為哪種數據類型分配內存,new將找到一個長度正確的內存塊,並返回該內存塊的地址。程序員的責任就是將該地址賦給一個指針。
(1) int * pn = new int;
(2) int higgens;
int * pt = &higgens;
(1)和(2)都是將一個int變量的地址賦給了指針。在(2)中可以通過名稱higgens來
訪問該int,在(1)中只能通過該指針進行訪問。pn指向的內存沒有名稱,pn指向一個數據對象,
此對象不是oop中的對象,而是一樣東西,數據對象比變量更通用,指的是數據項分配的內存塊。
- 使用delete釋放內存(如果不將new分配的內存釋放,發生內存泄漏)--------> delete pn; new並不意味着要使用用於new的指針,而是用於new的地址。
- 一般來說,不要創建兩個指向同一個內存塊的指針,因為這將增加錯誤的刪除同一個內存塊兩次的可能性。
4.適用new創建動態數組
-
int * psome = new int [10]; new運算符返回第一個元素的地址。對於new創建的數組,釋放則: delete [] psome; //方括號告訴程序,釋放整個數組,而不僅僅是指針指向的數組。
-
int * psome = new int [10]; 可以將它看做是一根指向該元素的手指。假設int占4個字節,則將手指沿正確的方向移動
4個字節,手指將指向第2個元素。共10個元素,這就是手指移動的范圍,因此,new語句
提供了識別內存塊中每個元素所需的全部信息。 - 使用new與delete注意事項
-
- 不要使用detlete來釋放不是new分配的內存。
- 不要使用delete釋放同一個內存塊。
- 如果使用new[]為數組分配內存,則應使用delete[]來釋放。
- 如果使用new[]為一個實體分配內存 ,則應使用delete(無方括號)來釋放。
- 對空指針應用delete是安全的。