它是什么:int(*z())[5];

4pi*_*ie0 1 c++ arrays pointers function-pointers

int (*z())[5];
Run Code Online (Sandbox Code Playgroud)

这是什么?如果我把它放在main之前作为全局声明它编译.我认为z()将是一个指针("z()")所以尝试:

int itab[5]={0,1,2,3,4};
((z())[0])[0]=itab;
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

错误:从'int*'到'int'的无效转换

所以我想啊哈,所以我很接近并尝试:((z())[0])[0]=*itab; 编译但链接器未解决的符号错误:

g ++ -o dist/Debug/GNU-Linux-x86/cppappl_example4 build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/main.o:in function main': /NetBeansProjects/cppappl_example4/main.cpp:242: undefined reference toz()'

所以我的问题是:这个声明是否正确?如果是,那么它是什么,如何使用它?


编辑:答案中给出的链接确实有很大的帮助:

大卫安德森的螺旋规则

和cdecl.org

谢谢!

Dav*_*eas 7

int (*z())[5];
Run Code Online (Sandbox Code Playgroud)

这是一个z()返回指向5 int数组的指针的函数int (*)[5].

((z())[0])[0]=itab;
Run Code Online (Sandbox Code Playgroud)

左侧调用函数(之前声明)并生成一个int (*)[5](调用它x),您可以取消引用x[0](转换为*(x+0),有效地*x),产生一个5 int(调用它y)的数组,您再次取消引用它y[0],产生左值引用到第一个元素,因此a int&.

右侧是5 int类型数组的左值.哪个会衰减到指向int的指针int*,所以只检查你拥有的类型:int & = int *,这是无效的.

如果你把它添加[0]到右边,那就会导致取消引用,并产生一个引用第一个元素的左值itab,它是类型的int,现在表达式是有意义的(类型明智的)int & = int.

现在的问题是你没有在z任何地方定义函数,因此链接器会抱怨.

这个宣言是否正确?如果是,那么它是什么,如何使用它?

这是正确的,无论是否需要都是另一回事.可能的定义z可能是:

typedef int int5[5]; // simplify syntax later on
int5* z() {
  static int array[5] = {}; 
  return &array;
}
Run Code Online (Sandbox Code Playgroud)