复杂的声明

我如何解释复杂的声明,如:

int * (* (*fp1) (int) ) [10]; ---> declaration 1 int *( *( *[5])())(); --------> declaration 2 

是否有任何规则应该遵循以理解上述声明?

这是一篇关于如何在C中阅读复杂声明的好文章: http : //www.codeproject.com/KB/cpp/complex_declarations.aspx

这对我帮助很大!

特别是 – 您应该阅读“正确的规则”部分。 这里引用:

int *(*(* fp1)(int))[10]; 这可以解释如下:

  1. 从变量名————————– fp1开始
  2. 没有什么是正确的但是)所以去左边找* ————–是一个指针
  3. 跳出括号并遇到(int)———到一个以int作为参数的函数
  4. 向左走,找到* —————————————-并返回一个指针
  5. 跳转括号,向右然后按[10] ——–到10的数组
  6. 左转找到* —————————————–指向
  7. 再向左走,找到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“的指针。

虽然它已经被回答了,但你也可以阅读这篇文章:

http://unixwiz.net/techtips/reading-cdecl.html

从最左边的标识符开始并逐步解决,记住在*之前没有任何显式分组[]()绑定,例如:

     * 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