用 C 語言來寫程式已有一段時間,但使用指標 (Pointer) 來編寫C時,總覺有點虛 (筆者仍是初學者),因為指標的變化比較多,還有點抽象!
在程式中宣告 (Declare) 變數 (Variable) 後,例如 int a, 在程式中可直接使用這變數 (Variable) 來做運算或儲存資料,而不需要知道變數 a的儲存位址。指標 (Pointer) 是儲存記憶體位址的資料型態,當宣告 (Declare) 後會配置一塊 4 bytes的記憶體空間,有時用指標 (Pointer) 來處理會比較簡潔,便需要用儲存位址作為參數。用 & (取址運算子 Address-of operator) 取得變數的位址,用 * 間接參考指使用指標取得某個記憶體的內容。
範例
|
描述
|
Description
|
int a;
|
一個整型數
|
An integer
|
int *a
|
一個指向整型數的指標
|
A pointer to an integer
|
int **a;
|
一個指向指標的的指標
|
A pointer to a pointer to an integer
|
int a[10];
|
一個有10個整型數的陣列
|
An array of 10 integers
|
int *a[10];
|
一個有10個指標的陣列
|
An array of 10 pointers to integers
|
int (*a)[10];
|
一個指向有10個整型數陣列的指標
|
A pointer to an array of 10 integers
|
int (*a)(int);
|
一個指向函數的指標
|
A pointer to a function a that takes an integer argument and returns an integer
|
int (*a[10])(int);
|
一個有10個指標的陣列,指向一個整形函數並有一個整形參數
|
An array of 10 pointers to functions that take an integer argument and return an integer
|
範例
|
描述
|
p = &a;
|
&a是取a的地址 (沒有&的話就變成取a的內容)
|
b = *p;
|
b的值被設定為指標p所指到記憶體的值 (沒有*的話就變成取p的內容,而不是透過p去取a的內容了)
|
*p = 0;
|
透過p將a的值被設定為0
|
p = &c;
|
指標p現在指向c
|
*p = *p + 10;
|
透過p把某記憶體 (現在是c) 的值增加10
|
y = *p + 1;
|
透過p取某記憶體的值 (現在是c) 加1之後,把結果存入y中
|
++*p;
|
指標p所指到的記憶體上1,這是因為++和*優先權同樣為2,右結合,因此*先做,再做++
|
int a = 88
int *aPointer // int *aPointer = &a
aPointer = &a;
prinf(“%d”, a); // 結果 : printf 顯示 a 是 88。
printf( “%d”, *aPointer); // 結果 : printf 顯示 *aPointer 是 88。
prinf(“%p”, &a); // 結果 : printf 顯示 &a 是 104。
prinf(“%p”, aPointer); // 結果 : printf 顯示 aPointer 是 104。
|
當宣告變數 a 整數值為 88,編譯器將變數 a 放在 104 的記憶體位址,然後再宣告指標變數 aPointer指向 a ,假設編譯器 aPointer 放在 108 的記憶體位址裡,如下圖所示:
2012 年 6 月 30 日 天氣報告
氣溫:27.5 度 @ 22:10
相對濕度:百分之91%
天氣:微雨