曾經以為,C語言對我來說已經深入骨髓,所有語法細節早已爛熟于胸,直到我遇到了一道筆試題,一道喪心病狂的筆試題,才漸漸明白,
圖樣,圖森破!哎我還是太年輕,

原題代碼復雜,記不住,但考核的關鍵語法點嘴臉如下:
// 失效的指標
int main(void)
{
void (*p)(); // 定義了一個指標
int a = 100;
p = &a; // 讓指標p指向了a
printf("a: %d\n", *p); // 將p的目標(即a)的值輸出
}
下面是輸出結果:
a: -3495729482452(亂碼)
輸出結果明顯是一個亂碼,但這個亂碼究竟是啥玩意兒咧?我們將源代碼稍作修改:
// 失效的指標
int main(void)
{
void (*p)(); // 定義了一個指標
int a = 100;
p = &a; // 讓指標p指向了a
printf("&a: %#x\n", &a); // 將a的地址以十六進制輸出
printf("*p: %#x\n", *p); // 將p的目標(即a)的值以十六進制輸出
}
下面是輸出結果:
&a:0xbfb4788
*p: 0xbfb4788
兩個輸出居然完全一樣!要知道,p里面就存放了a的地址,也就是說p本來就等于0xbfb4788,但是*p應該是p的目標,也就是100,但為什么還是一個地址呢?
將代碼再改一下:
// 失效的指標
int main(void)
{
void (*p)(); // 定義了一個指標
int a = 100;
p = &a; // 讓指標p指向了a
printf("p: %#x\n", p); // 將指標p存盤的地址以十六進制輸出
printf("*p: %#x\n", *p); // 將指標p的目標(即a)以十六進制輸出
printf("**p: %#x\n", **p); // 將不該輸出的東西輸出看看!
}
下面是輸出結果:
p: 0xbfb4788
*p: 0xbfb4788
**p:0xbfb4788
簡直不敢相信自己的眼睛,在這段代碼中,指標p仿佛中邪了,解參考符 * 對它不起作用了,不管p的前面加了多少個 *,始終無法得到p的目標,即a的值!
這是怎么回事咧?小伙伴,機智如你,將你的見解寫入留言,給大家參考參考吧!

如果你想深度學習C語言以及高級編程——編程俱樂部【下圖進入】!
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

程式員編程入門資料:

程式員?推薦學習書籍:

一個活躍、高逼格、高層次的程式員編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195897.html
標籤:C
