指標的宣告與使用

◎ 指標變數概念:「指標變數」(pointer variable)是一種特殊的變數,這種變數所儲存的是記憶體位址(一般佔有4個byte),而這個位址可能指向某個整數、字元、實數、或者其它型態的資料(在這裡我們暫稱它們為實體變數)。在這裡所謂的指向,意思是說從該位址開始,儲存了被指向的整數、字元、實數、或者其它型態的 實體變數之資料內容。
初學者可以將指標變數看成是個「鬼」,而一般型態的 實體變數看成是個「人」,而「鬼」有需要時會附到「人」身上 (鬼『指向』人)。
一個「鬼」只能附身到一個「人」身上,但是一個「人」可以被多個「鬼」附身。

◎ 語法範例:

(1) int  a = 40;    // 宣告了整數實體變數a(人),其資料內容為40

(2) int  *p;         // 宣告了指標變數p(鬼),可以用來指向整數的位址

40
p
a

(3) p = &a;        // 將變數a的記憶體位址設定給指標p,也就是讓p指向a,或者說是p鬼附身到a人

p
a
40

(4) *p = 20;       // 將指標p所指向記憶體之儲存內容(也就是變數a)改為20

a
p
40
20

指標運算中有兩個運算子:「&」與「*」。其中「&」是用來取得實體變數的記憶體位址,而「*」後面接上指標則代表指標所指之實體變數

複習:使用scanf()讀取整數變數a的內容時,必須寫成『scanf("%d", &a);』,其重點就是要將變數a的記憶體位址傳遞給scanf()函數。

◎ 指標應用觀念釐清:

假定已經宣告了『int  a=5, b=8, *p, *q;』,且執行了『p = &a;』及『q = &b;』敘述。其狀況如下圖所示:

a
8
p
5
b
q

則下列敘述會產生的變化分別圖示如下(假定(1)(2)個別獨立互不相干):

(1) *p = *q;

// 將*q內容設定給*p

a
8
p
5
b
q
8

(2) p = q;

a
8
p
5
b
q

// 指標p跟著指標q所指

// 兩鬼同附一人

錯誤的指標敘述(假定已經宣告『int  a=5, b=8, *p, *q;』,且執行了『p = &a;』及『q = &b;』敘述。):

(1) a = p;        // 『人=鬼;』型式,語法不對稱

(2) *p = q;      // 『人=鬼;』型式,語法不對稱

(3) p = b;       // 『鬼=人;』型式,語法不對稱

(4) p = *q;      // 『鬼=人;』型式,語法不對稱

(5) &a = p;     // 變數a 的記憶體位址不能再改變(人不能「附身」到鬼上)

(6) &a = &b;  // 變數a 的記憶體位址不能再改變(人也不能「附身」到人上)