a, b, c, d, p1, p2都是一般的變數,儲存在記憶體 (memory) 中。
其中,p1變數所記載的值是變數a的記憶體 (memory) 位址,
而p2則記載著b的記憶體位址,像這樣的狀況,我們就稱p1是一個指向a的指標,
相同的,p2是一個指向b的指標。
在C/C++中,我們用下面的式子來表示這個關係:
int *p1 = &a; int *p2 = &b;
其中的&,稱為address of (取址)。即,p1 = address of a,p2 = address of b。
另一個符號*,代表的意義是指標。
int *p1
要由後往前閱讀來瞭解它的意義:p1 is a pointer points to an integer。因此,
int *p1 = &a;
這整行,我們可以看成:p1 is a pointer points to integer variable a,
即:p1是一個指標,指向整數變數a。
且讓我們暫時打住指標的討論,轉頭看看參考 (reference)。
參考,可以想像成是一個變數或物件的別名 (alias)。通常,當函式 (function) 的參數 (parameter) 在函式中會被修改,而且要把這個修改結果讓呼叫函式的部份繼續使用,我們會用參考來當參數傳入函式中。
讓我們看看下面的例子:
參考,可以想像成是一個變數或物件的別名 (alias)。通常,當函式 (function) 的參數 (parameter) 在函式中會被修改,而且要把這個修改結果讓呼叫函式的部份繼續使用,我們會用參考來當參數傳入函式中。
讓我們看看下面的例子:
void swap(int &a, int &b){ int tmp = a; a = b; b = tmp; }
當其他程式呼叫此交換程式時,只要直接寫swap(x, y)就能交換x與y的值。
在這裡,a和b為x與y的別名,即:a就是x,b就是y,a和b不是x和y的複製品,
任何做用在a與b上的動作都會反應在x與y上面,反之亦然。
指標和參考之所以難懂,有很大一部份的原因是符號上的陌生所致。
加上&既能用於取址又能用於參考,容易造成初學者的混淆。
下面我們提供幾個建議來幫助各位看懂這些符號。
- 把int *p視為 int* p。
把int和*連在一起看,當作是一種型態叫做 "指向整數之指標",
要比int *p自然得多。同樣的方式也可以套在char* p或void* p等。但要注意的是下面的狀況:
int* p, q;
不要把這行誤解成p, q都是指向int之指標,事實上,q只是一個int變數。上面這行相當於
int *p, q;
或
int *p; int q;
如果p, q都要宣告成指向int之指標,應寫成:
int *p, *q
或者干脆分兩行寫:
int* p; int* q;
- 若&前面有資料型態 (ex: int &),則為參考,&前面有等號 (ex: int* p = &a),則為取址。
由於&同時具有多種意義,因此容易造成混淆。這裡列出的這個方法,可以幫助弄清楚每個&的意義。
沒有留言:
張貼留言