C/C++編程筆記:神一般的C語言指針,你能夠看懂多少?
曾經(jīng)閱讀《C/C++程序員面試指南》中指針一塊,以前一知半解的指針問題頃刻間懂了,今天分享一下,看大家是不是真正了解C語言指針!
下面,我們可以先來做個(gè)測試,如果下面的指針問題你能夠全都解答正確,那么你的C語言功底真是神一般的了。

1.int *p;
2.int **p;
3.int *p[10];
4.int (*p)[10];
5.int *p(int);
6.int (*p)(int);
7.int (*p[10])(int);
這七個(gè)難度還不是很大,相信大多數(shù)讀者都能夠答的出來。
答案:
1.一個(gè)指向整型數(shù)據(jù)的指針
2.一個(gè)指針的指針,它指向的指針指向一個(gè)整型數(shù)據(jù)
3.一個(gè)有十個(gè)指針的數(shù)組,該指針指向整型數(shù)據(jù)
4.一個(gè)指向有十個(gè)整型數(shù)據(jù)數(shù)組的指針
5.就一個(gè)函數(shù)(不是函數(shù)指針),該函數(shù)有一個(gè)整型參數(shù),返回值為一個(gè)指向整型的指針
6.一個(gè)函數(shù)指針,該函數(shù)有一個(gè)整型的參數(shù),返回值為整型類型
7.一個(gè)有十個(gè)指針的數(shù)組,該數(shù)組中的指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)
啊,當(dāng)時(shí)看完我就吁了口氣,真神一般似的,但是但我接著看下去,下面有碰到一個(gè),我徹底崩潰了.......

題目是這樣的:
請(qǐng)解析 (*(void (*)())0)() 的含義。// 怎么樣?要HOLD住阿!
分析問題:
不賣關(guān)子了,但是我早HOLD不住了。書中的答案是這樣的:
有些微處理器從0地址啟動(dòng),有時(shí)為了模擬開機(jī)時(shí)的情形,需要設(shè)計(jì)一條C 語句,去執(zhí)行0地址的內(nèi)容,于是就有了(*(void (*)())0)() 這條語句。
這條語句一眼看上去讓人頭疼,但分析之后還是挺簡單的。
首先,當(dāng)有如下函數(shù)聲明時(shí):
void fun(param);
這個(gè)函數(shù)的調(diào)用形式為:fun(param);
題目的函數(shù)沒有參數(shù),所以就簡化成fun();
而0是這個(gè)函數(shù)的入口地址,即0就是這個(gè)函數(shù)的指針值,指針的函數(shù)聲明為:
void (*pFun)(param);
調(diào)用形式為:(*pFun)(param);
對(duì)于本題可以寫成:( *0 ) ();
但是函數(shù)指針變量不能是個(gè)常數(shù),所以還要把0強(qiáng)制轉(zhuǎn)換成函數(shù)指針,根據(jù)原題可以元函數(shù)的函數(shù)指針原型為 void (*)();

于是(*(void (*)())0)()可以這樣來分析,首先用void (*)()把0強(qiáng)制轉(zhuǎn)換成了函數(shù)指針,然后再調(diào)用函數(shù)指針0所指向的函數(shù)。
可以用typedef來加深對(duì)本句的理解,如下:
typedef void (*pFun)();
((*pFun)0)();
這兩句和(*(void (*)())0)()是等價(jià)的,但是這樣更有助于加深對(duì)本句的理解。
總結(jié):(*(void (*)())0)()就是 *(void (*)())0 所對(duì)應(yīng)的函數(shù)的調(diào)用。
希望對(duì)大家有幫助!

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~