复杂的声明
我如何解释复杂的声明,如:
int * (* (*fp1) (int) ) [10]; ---> declaration 1 int *( *( *[5])())(); --------> declaration 2
是否有任何规则应该遵循以理解上述声明?
这是一篇关于如何在C中阅读复杂声明的好文章: http : //www.codeproject.com/KB/cpp/complex_declarations.aspx
这对我帮助很大!
特别是 – 您应该阅读“正确的规则”部分。 这里引用:
int *(*(* fp1)(int))[10]; 这可以解释如下:
- 从变量名————————– fp1开始
- 没有什么是正确的但是)所以去左边找* ————–是一个指针
- 跳出括号并遇到(int)———到一个以int作为参数的函数
- 向左走,找到* —————————————-并返回一个指针
- 跳转括号,向右然后按[10] ——–到10的数组
- 左转找到* —————————————–指向
- 再向左走,找到int ——————————– ints。
你可以使用cdecl
*
:
cdecl> explain int *( *( *a[5])())(); declare a as array 5 of pointer to function returning pointer to function returning pointer to int cdecl> explain int * (* (*fp1) (int) ) [10]; declare fp1 as pointer to function (int) returning pointer to array 10 of pointer to int
*
Linked是一个在后端使用此命令行工具的网站。
我很久以前就学会了以下方法:
从类型标识符(或内括号)开始,然后沿着螺旋线移动,首先将元素放在右边
的情况下
int * (* (*fp1) (int) ) [10];
你可以说:
- fp1是a(右边没有任何东西所以向左移动)
- 指向(移出内括号
- 以int作为文章的函数(右边第1个)
- 并返回一个指针(从括号中退出)
- 一个由10个元素组成的数组
- 指针(右边没有任何东西)
- INT
导致:
fp1是一个指向函数的指针,该函数接受一个int并返回一个指向10个指向int的数组的指针
绘制实际螺旋(至少在你的脑海中)有很大帮助。
为了解决这些复杂的声明,需要记住的规则是函数调用operator()和数组下标operator []的优先级高于取消引用运算符*。 显然,括号()可用于覆盖这些优先级。
现在,从中间计算出你的声明,这意味着从标识符名称。
int *(*(* fp1)(int))[10]; —>声明1
根据上面提到的优先级规则,您可以通过将声明分解为,轻松地理解它
fp1 *(int)* [10] * int
并且用英语从左到右直接读取它为“fp1是一个指向函数的指针,该函数接受一个int并返回指向指向int”的数组[10]的指针。 请注意,声明以这种方式被破坏只是为了帮助手动理解它。 编译器不需要以这种方式解析它。
同样的,
int *(*(* [5])())(); ——–>声明2
被打破了
[5] *()*()* int
因此,它声明了一个类型指向function()的数组[5],它返回一个指向function()的指针,该指针又返回一个指向int“的指针。
虽然它已经被回答了,但你也可以阅读这篇文章:
从最左边的标识符开始并逐步解决,记住在*
之前没有任何显式分组[]
和()
绑定,例如:
* a [] - 是一个指针数组 (* a)[] - 是指向数组的指针 * f() - 是一个返回指针的函数 (* f)() - 是指向函数的指针
因此,我们将int *(*(*fp1)(int))[10]
读作:
fp1 -- fp1 *fp1 -- is a pointer (*fp1)(int) -- to a function taking an int parameter *(*fp1)(int) -- returning a pointer (*(*fp1)(int))[10] -- to a 10-element array *(*(*fp1)(int))[10] -- of pointer int *(*(*fp1)(int))[10] -- to int
声明int *(*(*[5])())()
提出了一些挑战,因为没有标识符; 您通常会在函数声明中看到这一点,其中参数属于该类型:
void foo(int *(*(*[5])())(), double);
它与fp1
声明中的未命名int
参数的原理相同。 数组为我们提供了线索,您还可以查找最左侧的括号内部分组。
-- unnamed [5] -- is a 5-element array ([] binds before *) *[5] -- of pointers (*[5])() -- to functions *(*[5])() -- returning pointers (*(*[5])())() -- to functions *(*(*[5])())() -- returning pointers int *(*(*[5])())() -- to int
顺时针/螺旋:
* http://c-faq.com/decl/spiral.anderson.html