C語言中的 和 符號

2022-06-28 17:54:11 字數 1684 閱讀 7114

之前對*和&符號一直理解的比較淺顯。只知道: 

*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...