c-复杂的指针声明



我在cdecl.org中尝试了声明int * p()[],它说"将p声明为返回int指针数组的函数"。

根据我的说法,声明的意思是"p是返回int指针的函数数组",这没有任何意义。所以这种声明不应该被允许,对吧?

我哪里错了?

这个声明确实不应该被允许;函数可能不会返回数组类型,并且您可能没有函数类型为的数组

6.7.6.2数组声明符

约束

1除了可选的类型限定符和关键字static之外,[]还可以分隔表达式或CCD_ 5。如果它们对表达式(指定数组的大小)进行定界表达式应具有整数类型。如果表达式是常量表达式,则应具有大于零的值元素类型不能是不完整的或函数类型可选类型限定符和关键字static只能出现在使用数组类型声明函数参数,然后仅在最外层数组类型派生。
。。。
函数声明器(包括原型)类型

C 2011在线草案

增加了重点。我不知道cdecl为什么不返回某种错误。

如果你想要一个返回数组指针的函数,你可以写

int (*p())[N];

这解析为

p         -- p is a
p()       -- function returning
*p()       -- pointer to
(*p())[N]   -- array of 
int (*p())[N];  -- int

如果你想要一个函数指针数组,你可以写

int (*p[N])();

解析为

p        -- p is an
p[N]     -- array of
*p[N]     -- pointer to
(*p[N])()  -- function returning
int (*p[N])(); -- int

如果你想要一个返回指向指针数组的指针的函数,你可以写

int *(*p())[N];

读取为

p         -- p is a
p()       -- function returning
*p()       -- pointer to
(*p())[N]   -- array of
*(*p())[N]   -- pointer to
int *(*p())[N];  -- int

Postfix[]()的优先级高于一元*,因此:

T *a[N];   // a is an array of pointer to T
T (*a)[N]; // a is a pointer to an array of T
T *f();    // f is a function returning pointer to T
T (*f)();  // f is a pointer to a function returning T

从这些规则开始,您可以使用替换来构建更复杂的声明。如果您想要一个函数返回指向数组的指针,请使用

T (*a)[N];

并用函数声明符替换a

T (*  a  )[N];
|
V
T (* f() )[N];

如果您想要一个指向函数的指针数组,请使用函数指针声明符

T (*f)();

并用数组声明符替换f

T (*   f   )()
|
V
T (*  a[N] )();

从这里,您应该能够读取(并生成)更复杂的类型。

cdecl是一个不错的工具,但一旦您了解了C声明语法的实际工作原理,就不需要它了。

最新更新