首頁>技術>

今天閱讀了一本關於程式設計師面試指南中指標一塊,以前一知半解的指標問題頃刻間懂了不少。

下面,可以做個測試,如果下面的指標問題你能夠全都解答正確,那麼你的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();

而0是這個函式的入口地址,即0就是這個函式的指標值,指標的函式宣告為:

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語言指標.....希望對大家掌握指標有所幫助(*^__^*)

感謝觀看!

如果你也想成為一名程式設計師那就關注我,不管是任何Q:【7】【2】【0】基礎小夥伴,工作需要學習C/C++、感興趣、為了入行、轉行學習C/C++ 【1】【6】【8】可以一起學習,每晚會有大牛講解技術,和志同道合的小夥伴一起加油學習【5】【7】【3】一起成長進步吧,C/C++程式設計直播學習裙學習資料、視訊教程、技術大牛助你早日成為一名優秀的程式設計師!九星連珠我將會實現你一個夢想, 讓你少份畏懼,還你一顆技術心!

學習推拿路線:

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 詳解分散式資料庫中介軟體mycat功能、原理、場景及長期路線圖