今天閱讀《c/c++程式設計師面試指南》中指標一塊,以前一知半解的指標問題頃刻間懂了。
下面,可以做個測試,如果下面的指標問題你能夠全都解答正確,那麼你的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);
這七個難度還不是很大,相信大多數讀者都能夠答的出來。
答案:1.乙個指向整型資料的指標
2.乙個指標的指標,它指向的指標指向乙個整型資料
3.乙個有十個指標的陣列,該指標指向整型資料
4.乙個指向有十個整型資料陣列的指標
5.就乙個函式(不是函式指標),該函式有乙個整型引數,返回值為乙個指向整型的指標
6.乙個函式指標,該函式有乙個整型的引數,返回值為整型型別
7.乙個有十個指標的陣列,該陣列中的指標指向乙個函式,該函式有乙個整型引數並返回乙個整型數
啊,當時看完我就籲了口氣,真神一般似的,但是但我接著看下去,下面有碰到乙個,我徹底崩潰了.......
題目是這樣的:
請解析 (*(void (*)())0)() 的含義。// 怎麼樣?要hold住阿!
分析問題:
不賣關子了,但是我早hold不住了。書中的答案是這樣的,
有些微處理器從0位址啟動,有時為了模擬開機時的情形,需要設計一條c 語句,去執行0位址的內容,於是就有了(*(void (*)())0)() 這條語句。
這條語句一眼看上去讓人頭疼,但分析之後還是挺簡單的。
首先,當有如下函式宣告時:
void fun(param);
這個函式的呼叫形式為:fun(param);
題目的函式沒有引數,所以就簡化成fun();
void (*pfun)(param);
呼叫形式為:(*pfun)(param);
對於本題可以寫成:( *0 ) ();
但是函式指標變數不能是個常數,所以還要把0強制轉換成函式指標,根據原題可以元函式的函式指標原型為 void (*)();
於是(*(void (*)())0)()可以這樣來分析,首先用void (*)()把0強制轉換成了函式指標,然後再呼叫函式指標0所指向的函式。
可以用typedef來加深對本句的理解,如下:
typedef void (*pfun)();
((*pfun)0)();
這兩句和(*(void (*)())0)()是等價的,但是這樣更有助於加深對本句的理解。
總結:(*(void (*)())0)()就是 *(void (*)())0 所對應的函式的呼叫。
神一般的C語言指標,你看懂多少?
今天閱讀 c c 程式設計師面試指南 中指標一塊,以前一知半解的指標問題頃刻間懂了。下面,可以做個測試,如果下面的指標問題你能夠全都解答正確,那麼你的c語言功底真是神一般的了。1.int p 2.int p 3.int p 10 4.int p 10 5.int p int 6.int p int ...
C 神一般的C語言指標,你看懂多少?
今天閱讀 c c 程式設計師面試指南 中指標一塊,以前一知半解的指標問題頃刻間懂了。下面,可以做個測試,如果下面的指標問題你能夠全都解答正確,那麼你的c語言功底真是神一般的了。1.int p 2.int p 3.int p 10 4.int p 10 5.int p int 6.int p int ...
神一般的指標
本篇部落格並不對指標的基本概念進行講述,而是針對指標常出現的一些理解誤區進行解析。乙個指向整型資料的指標。乙個指標的指標,它指向的指標指向乙個整型資料。p 是 int 型別,所以 p 是int 型別,即 p是乙個指向int的指標,所以p是乙個指向int的指標的指標。乙個有10個指標的陣列,該指標指向...