C/C++ 指標小結——指標的概念和如何使用指標
一、理解指標
當我們宣告一個變數時,系統會在記憶體中分配適當的儲存空間,以儲存該變數的值,由於每一個位元組都有唯一的地址編號,因而記憶體儲存空間都有自己的地址編號。又由於記憶體地址只是編號,因而又可以把它複製給變數,這種儲存地址的變數就稱為指標變數。
我們並不關心指標的實際值,因為每次執行時,指標的值都會發生變化的(每次執行意味著變數重新分配地址)。
我們不能直接儲存地址的值,只能利用地址運算子(&),通過儲存在地址中的變數來獲得地址的值。位於變數之前的地址運算子(&)將可返回該變數的地址。運算子&只能用於單個變數或陣列元素。
二、指標變數的宣告及初始化
由於指標變數包含的是儲存某種資料型別的地址,因此在使用前必須把它們宣告為指標。 例如:
int *p; //integer pointer 把變數p宣告為指標變數,指向整型資料
把變數的地址賦值給指標變數的過程稱為指標變數的初始化。
必須確保指標總是指向相應的資料型別。
指標可以初始化給變數,NULL,零。
指標很靈活,我們可以在不同的語句中使用同一指標指向不同的資料型別,也可以使用不同的指標指向同一資料變數。
三、通過指標訪問變數
我們可以用間接運算子‘*’ (反引用運算子) 來實現對指標變數的值的訪問。 例如:
int quantity, *p, n; quantity = 179; p = &quantity; n = *p;
故n==179。 特別注意:
*ptr = 25;
該語句把值25存放在地址等於ptr的值的記憶體中。
四、指標鏈(指向指標的指標)
指向指標的指標變數必須在名稱的前面新增額外的間接運算子。例如:
int **p2;
該宣告語句告訴編譯器 p2 是指向int型別的指標的指標。
五、指標表示式
關於指標所指變數的值的表示式;例如:如果p1和p2都是宣告並初始化了得指標,那麼下面的語句是合法的:
y = *p1 * *p2; //第二個 * 是運算子號
sum = sum + *p1;
z = 5* - *p2/*p1;
*p2 = *p2 + 10;
關於關於指標的表示式 C語言允許對指標與整數進行運算;也可以在兩個指標之間進行減法運算。例如:
p1 - 2;
p1 - p2;
如果 p1 和 p2 指向相同的陣列,那麼p2-p1將給出p1與p2之間的元素數目(p1/p2、p1*p2、p1/3)。指標不能用於除法或乘法運算(p1+p2);類似地,不能對兩個指標進行加法操作。
還可以使用關係運算符進行指標的的比較。諸如p1 > p2、 p1 == p2和p1 != p2都是允許的。但是,指向不同或無關聯變數的指標間的比較沒有意義。比較可以用於處理陣列和字串。
六、指標的遞增與比例因
在指標進行遞增時,所增加的值為該指標指向資料型別的“長度”。這種長度就稱為比例因子(scale factor)。例如:如果p1為整形指標,初始值為2800,那麼經過p1 = p1 + 1運算後p1的值為2802,而不是2801。