回答
先从最左边的标识符,那么你的工作方式进行记住[]
和()
*
之前绑定,所以*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