Pointer - declaration
pointer 的宣告對初學者而言可能會有些困惑,原因來自 declare 時跟使用時的 *.
我們考慮一個抽象型態 T, T 可以是 int, short 或是其他的 structure.
T a;
(如果不清楚的可以先將 T 換成 int)
上面這段 code 應該是沒有什麼疑問,就是單純宣告一個型態為T的變數.
現在考慮
T* pa;
在 C 語言中 T* pa, T * pa; 與 T *pa 是沒有差別的。然而在這邊我使用了 T* pa來強調 T* 與 pa 關係。 T*是指向T的指標,或者可以說 T* 是一個型態,這個型態內容是存 T 的 address.
(雖然這邊使用 T* pa, 但事實上這樣的寫法可能會造成 T* pa, pb的一些誤會,但無論那種寫法都需要細心以免出錯)
先提一下dereference. 如果我們想要使用 pa 所指的內容物,語法是 *pa. 例如說,T為 int 的話,我們可以 *pa = 10來改變 pa 所指的內容物。也就是說 pa 本身是 T* 的型態,而 *pa會是 T 型態。
我們考慮以下的code
int a;
int * pa = &a;
這邊也許初學者會有疑問-
剛剛不是說 *pa 是 int型態,那為何可以將 &a assign 給 *pa?
這個問題在於,我們如何去"解釋" int * pa = &a; 這段話。
稍微排版一下,再看一次 int* pa = &a. 我們先分開看這個敘述中的幾個要素-int*, pa,&a.
int* 的角色是 "型態"
pa 的角色是 "變數"
&a 的角色是 "初始值"
角度並非是 int, *pa, &a
所以錯誤的解讀如下
int 是 型態
*pa 是 變數 (但事實上這樣做已經在 "操作" 變數)
&a 是 初始值
謹慎使用指標
在使用指標時一定要一再檢查以及提醒自己,在 dereference 時是否是使用有效的address
一個初學者會犯的錯誤是 -
int * a;
*a = 10;
此時 a 裡面不知道是什麼東西,不可直接使用。另一方面,宣告指標時都建議有初始值,若一開始在流程上尚未決定指向何處,也該指向 NULL.