相同的星號不同的含義

前提

圍繞 C 和 C++中指標語法最令人困惑的事情是,當指標符號星號(*)與變數一起使用時,實際上有兩種不同的含義。

首先,使用* 宣告一個指標變數。

int i = 5;
/* 'p' is a pointer to an integer, initialized as NULL */
int *p = NULL;
/* '&i' evaluates into address of 'i', which then assigned to 'p' */
p = &i;
/* 'p' is now holding the address of 'i' */

當你沒有宣告(或乘法)時,*用於取消引用指標變數:

*p = 123;
/* 'p' was pointing to 'i', so this changes value of 'i' to 123 */

如果希望現有指標變數儲存其他變數的地址,則不要使用*,而是這樣做:

p = &another_variable;

當 C 程式設計新手同時宣告和初始化指標變數時,會出現常見的混淆。

int *p = &i;

由於 int i = 5;int i; i = 5; 給出相同的結果,他們中的一些人可能認為 int *p = &i;int *p; *p = &i; 也給出相同的結果。事實是,不,int *p; *p = &i; 會嘗試推導一個未初始化的指標,這將導致 UB。當你沒有宣告或取消引用指標時,切勿使用*

結論

星號(*)在 C 中與指標有兩個不同的含義,具體取決於它的使用位置。當一個內使用的變數宣告,在等號側的右手側的值應該是一個指標值到一個地址在儲存器中。當與已宣告的變數一起使用時,星號將取消引用指標值,將其跟隨到記憶體中的指向位置,並允許分配或檢索儲存在那裡的值。

帶走

在處理指標時,重要的是要記住你的 P 和 Q. 請注意你何時使用星號,以及在使用星號時的含義。忽略這個微小的細節可能會導致你真正不想要處理的錯誤和/或未定義的行為。