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. 例如說,Tint 的話,我們可以 *pa = 10來改變 pa 所指的內容物。也就是說 pa 本身是 T* 的型態,而 *pa會是 T 型態。

我們考慮以下的code

int a;
int * pa = &a;

這邊也許初學者會有疑問-
剛剛不是說 *paint型態,那為何可以將 &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.

results matching ""

    No results matching ""