之前對*和&符號一直理解的比較淺顯。只知道:
*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。
int a = 10;
int *b = &a;
printf("%p\n",&a); \\輸出變數a自身位址
printf("%p\n", b); \\輸出指標b中指向的位址,即a位址
printf("%p\n", &b); \\輸出指標b自身的位址
printf("%d\n", a); \\輸出變數a中資料10
printf("%d\n", b); \\輸出指標b中儲存的資料,5240892即為16進製制004ff83c
printf("%p\n", b); \\輸出指正b中儲存資料,以指標格式輸出
printf("%d\n", *b); \\輸出指標b指向的位址內的資料,即a的資料
輸出結果:
004ff83c
004ff83c
004ff830
105240892
004ff83c
10
C語言中的 和 符號
之前對 和 符號一直理解的比較淺顯。只知道 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 64876...
C語言中的 和 符號
c語言中的 和 符號 int main void 執行結果 a 10 a 0021f7c b 0021f7cc b 10一臉懵逼,為什麼 a和 b的值不是一樣?這才發現自己其實一點都沒有搞懂。所以a本來代表兩個值 儲存單元的位址和儲單元中的資料。於是就有了二異性。為了消除這種二義性,c語言規定a表示...
C語言中的強符號和弱符號
c語言中的強符號和弱符號 c語言真的很奇怪,各種你想不到的問題都會出現,但是仔細分析這個問題,無不很有道理,這些都不是c語言的漏洞,而是這門語言的強大之處。首先介紹一下強符號和弱符號。當多個c檔案需要一起編譯執行的時候,就會有強弱符號的問題。為什麼會有多個c檔案一起編譯呢?這就的說起鏈結linkin...