天天看點

c指針解讀之左右法則(2)1:int* (a[5])(int, char);2:void (b[10]) (void ()());3:int(*)() (*c)[9];4:int ((*d)[5])(int );5:int ((*e)(int ))[5];

1:int* (a[5])(int, char);

  首先看到辨別符名a,”[]”優先級大于”“,a與”[5]”先結合。是以a是一個數組,這個數組有5個元素,每一個元素都是一個指針,指針指向”int (int, char*)”,很明顯,指向的是一個函數,這個函數參數是”int, char*”,傳回值是”int*”。OK,結束了一個。:)

2:void (b[10]) (void ()());

  b是一個數組,這個數組有10個元素,每一個元素都是一個指針,指針指向一個函數,函數參數是”void (*)()”【注:這也是一個函數指針, 參數為空,傳回為void】,傳回值是”void”。完畢!

3:int(*)() (*c)[9];

   c是一個指針,指針指向一個數組,這個數組有9個元素,每一個元素都是”int(*)()”(也即一個函數指針,指向一個函數,這個函數的參數為空,傳回值是int型)。

4:int ((*d)[5])(int );

(*d)——指針;

(*d)[5]——這個指針指向一個數組;

*(*d)[5]——這個數組中每個元素都是指針類型;

int (int *)—— 什麼類型的指針?這個類型的。

5:int ((*e)(int ))[5];

e—–向右遇到括号,向左遇到,說明e是個指針,啥指針呢?

(e)(int )——跳出括号向右遇到(int ),說明這個指針是個函數指針,形參為int, 傳回值為何?且聽下回分解:);

(*e)(int )——傳回值為何?向右遇到括号,再向左,喔,遇到*了,那就是傳回了一個指針了。啥指針呢? 同樣地,下回分解;

((*e)(int ))[5]——-向右遇到[],說明那是個指向數組的指針,是啥數組呢?不急,慢慢來;

int ((*e)(int ))[5]——-向左遇到int,喔,明白了,就是個簡單的整型數組。OVER

當然實際當中,當需要聲明一個複雜指針時,如果把整個聲明寫成上面所示的形式,對程式可讀性将是一個巨大損害。誰要是寫出這樣BT的指針聲明,那就真是丢rp了,估計會被罵死!。

還是用typedef來對聲明逐層分解替換下吧,增強可讀性。

例如對于上面的聲明:int ((*func)(int ))[5]; 可以這樣分解:

typedef int (*pArr)[5];

typedef pArr (func)(int );

這樣就容易讀得多了啊!

再看看這個啥意思? typedef int (* (* (FUNC)(int ) )[5] )(int *); —- 暈了吧。

其實typedef int (* (* (FUNC)(int ) )[5] )(int *);

等價與下面的:)

typedef int (PF)(int );

typedef PF (*PARRAY)[5];

typedef PARRAY (FUNC)(int );

((void ()())0)();——->這個呢?

按左右法則:

(void (*)()) —–是一個傳回值為void,參數為空的函數指針原型。

  (void (*)())0—–把0強轉成一個傳回值為void,參數為空的函數指針,指針指向的位址為0.

  (void ()())0—–前面加上*表示整個是一個傳回值為void的函數的名字

  ((void ()())0)()——這當然就是一個函數調用了。

再typedef化簡下:

typedef void (*pf)();

(*(pf)0)();

繼續閱讀