C語言中的*和&符號

XP_32986175發表於2017-11-18

之前對*和&符號一直理解的比較淺顯。只知道:
*p好像表示的是一個指標;
&p表示的是一個地址。
然而這次當遇到了下面這個情況的時候:
int a = 10;
int *b = &a;

printf(“%d\n”, a);
printf(“%d\n”, &a);
printf(“%d\n”, b);
printf(“%d\n”, *b);

結果:
10
6487620
6487620
10

一臉懵逼,為什麼&a和*b的值不是一樣?這才發現自己其實一點都沒有搞懂。

經過學習後,總結出來:
變數a 本質上代表一個儲存單元。CPU通過該儲存單元的地址訪問該儲存單元中的資料。所以a本來代表兩個值:儲存單元的地址和儲單元中的資料。於是就有了二異性。為了消除這種二義性,C語言規定a表示儲存單元中的資料,&a表示儲存單元的地址。
a儲存單元中的資料可以是一個普通數值,也可以是另一個儲存單元的地址,比如:a = &b; 語句就是將b的儲存單元的地址存入a儲存單元中。C語言規定*a代表a中儲存的地址對應的儲存單元中的資料,也就是訪問*a就等於訪問b,於是*a提供了通過a訪問b中的資料的手段。

a表示a對應的儲存單元中的資料。
&a表示a對應的儲存單元的地址。
*a表示:首先,要求a對應的儲存單元中的資料一定是另一個儲存單元的地址。
於是,*a表示另一個儲存單元中的資料。
當a宣告的型別是int時,a中儲存的是一個整數數值,通過a可以訪問(讀取或修改)這個數值。
當a宣告的型別是int*時,a中儲存的是一個儲存單元的地址,而該儲存單元中儲存的資料是一個整數數值;通過*a可以訪問(讀取或修改)這個數值。a == &*a 都是該儲存單元的地址。
當a宣告的型別是int**時,a中儲存的是一個儲存單元的地址,而該儲存單元中儲存的資料是另外一個儲存單元的地址,另外這個儲存單元中儲存的是一個整數數值;通過**a可以訪問(讀取或修改)這個數值。

最後,在C語言裡地址叫指標。還有,在C語言中的陣列本質上其實也是指標,即:*a 等同於 a[]。

相關文章