回答
先從最左邊的標識符,那麼你的工作方式進行記住[]
和()
*
之前綁定,所以*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);
所以,最後一行
- 指針引用
arr
- 調用結果函數(
func
) - 解除引用從
func
返回的指針,它給了我們陣列(funcArr
) - 索引查找函數指針
i
- 指針引用是指針給我們的
f0
一個...f7
- 並調用結果函數使得
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
應該如何使用。
arr
是pointer to a function returning pointer to an array of 8 pointers to a function which takes 2 int as an argument returning char
有關詳細看到this naming of complex declarations using clockwise/spiral rule
arr
是一個指向返回指針到一個陣列8個指針這需要2個參數爲INT被返回字符的功能的功能。你一定要檢查這個link這將幫助你解碼這樣複雜的聲明。 PS:我建議不要有這樣複雜的聲明。分解成部分。
而且我建議你不要使用返回指向其他函數指針數組的指針的指針。如果你這樣做,你的下一個問題可能是「爲什麼這不工作?」。 :-) –
- 1. 這個C#聲明是什麼意思?
- 2. 聲明新員工聲明是什麼意思* [編號] C++
- 3. 以下聲明是什麼意思?
- 4. 這個CSS聲明是什麼意思?
- 5. 以下聲明是什麼意思?
- 6. 什麼`... |類型聲明中的b - > c是什麼意思?
- 7. 這個聲明是什麼//! [數字]是什麼意思?
- 8. 這個C函數聲明是什麼意思?
- 9. C中的聲明'(int *)ptr [N]'是什麼意思?
- 10. C++/CLI中的聲明「String^strtests」是什麼意思?
- 11. C++/CLI對象^%(caret percent-sign)聲明是什麼意思?
- 12. c函數聲明中的「...」是什麼意思?
- 13. C中的這個雙聲明是什麼意思?
- 14. C#.net中的這個聲明是什麼意思?
- 15. 在聲明方法時,C++中的= 0是什麼意思?
- 16. 是什麼意思:是什麼意思?
- 17. 這是什麼CSS聲明的意思是 - 兩個聲明一次
- 18. **是什麼意思,C?
- 19. %* c是什麼意思?
- 20. 這是什麼意思? [c#]
- 21. C中##是什麼意思?
- 22. 這是什麼意思-c
- 23. 這是什麼意思 - C#
- 24. cmd/C是什麼意思?
- 25. Java錯誤 - 不是一個聲明,這是什麼意思?
- 26. $是什麼?意思是在shell中如果聲明?
- 27. 說明什麼是「神器」意思是
- 28. 什麼?在C#中是什麼意思?
- 29. 這是什麼?運算符在C#中的意思是類型聲明之後?
- 30. 什麼是一個問號的意思是在C#中的函數聲明
爲什麼讓一種語言不可讀?神.. – Krishnabhadra
使用[cdecl](http://cdecl.ridiculousfish.com/?q=char+%28*+%28+*+%28*+ARR+%29+%28+%29+%29+ [ 8]%29 +%28int%2Cint%29)。 –
看到我的答案[這裏](http://stackoverflow.com/a/13592447/1157444) – iabdalkader