2012-11-29 106 views
0

考慮下面的C聲明:C聲明是什麼意思?

typedef char (* (* (* ARR) ()) [8]) (int,int) ;  
ARR arr; 

是什麼arr意味着什麼?

+0

爲什麼讓一種語言不可讀?神.. – Krishnabhadra

+9

使用[cdecl](http://cdecl.ridiculousfish.com/?q=char+%28*+%28+*+%28*+ARR+%29+%28+%29+%29+ [ 8]%29 +%28int%2Cint%29)。 –

+0

看到我的答案[這裏](http://stackoverflow.com/a/13592447/1157444) – iabdalkader

回答

3

先從最左邊的標識符,那麼你的工作方式進行記住[]()*之前綁定,所以*a[]是指針數組,(*a)[]是一個指向數組的指針,*f()是返回指針的函數,(*f)()是指向一個功能:

typedef    ARR       -- ARR is a typedef for 
        (* ARR)       -- a pointer 
        (* ARR) ()      -- to a function 
       (* (* ARR) ())     -- returning a pointer 
       (* (* ARR) ()) [8]    -- to an 8-element array 
      (* (* (* ARR) ()) [8])    -- of pointers 
      (* (* (* ARR) ()) [8]) (  ) -- to functions 
      (* (* (* ARR) ()) [8]) (int,int) -- taking two int parameters 
typedef char (* (* (* ARR) ()) [8]) (int,int) ; -- and returning char 

所以

ARR arr; 

聲明arr是指向函數的指針,返回指向返回char的函數的指針的8元素數組的指針。

這裏是什麼這個看起來像在實際的例子:

char f0(int a, int b) { ... } 
char f1(int x, int y) { ... } 
char f2(int g, int h) { ... } 
... 
char f7(int r, int s) { ... } 

// funcArr is an *array* of pointers to functions, not a function 
char (*funcArr[8])(int, int) = {f0, f1, f2, f3, ..., f7}; 

// func is a function that will return the funcArr array 
char (*(*func())[8])(int,int) { return funcArr; } 

arr = func; 

char c = (*(*(*arr)())[i])(x,y); 

所以,最後一行

  1. 指針引用arr
  2. 調用結果函數(func
  3. 解除引用從func返回的指針,它給了我們陣列(funcArr
  4. 索引查找函數指針i
  5. 指針引用指針給我們的f0一個...f7
  6. 並調用結果函數使得typedef有點更具可讀性的

一種方法是做到這一點的階段:

typedef char CharFunc(int, int); 
typedef CharFunc *CharFuncArray[8]; 
typedef CharFuncArray *ArrayFunc(); 

ArrayFunc *arr; 

就個人而言,我不喜歡做的事情如此方式,因爲它不是很明顯如何從ArrayFunc *arr

char c = (*(*(*arr)())[i])(x,y); 

而聲明l IKE

char (*(*(*arr)())[8])(int,int); 

告訴你確切arr應該如何使用。

2

arr是一個指向返回指針到一個陣列8個指針這需要2個參數爲INT被返回字符的功能的功能。你一定要檢查這個link這將幫助你解碼這樣複雜的聲明。 PS:我建議不要有這樣複雜的聲明。分解成部分。

+0

而且我建議你不要使用返回指向其他函數指針數組的指針的指針。如果你這樣做,你的下一個問題可能是「爲什麼這不工作?」。 :-) –