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

时间:2013-04-01 15:22:29

标签: c++ arrays pointers function-pointers

int (*z())[5];
这是什么?如果我把它放在main之前作为全局声明它编译。我认为z()将是一个指针(“z()”),所以尝试了:

int itab[5]={0,1,2,3,4};
((z())[0])[0]=itab;

这给出了错误:

  

错误:从'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:   在函数main': /NetBeansProjects/cppappl_example4/main.cpp:242: undefined reference to z()'

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


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

nice rule of spiral by David Anderson

and cdecl.org

谢谢!

2 个答案:

答案 0 :(得分:7)

int (*z())[5];

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

((z())[0])[0]=itab;

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

右侧是5 int类型数组的 lvalue 。哪个会衰减为指向int int*的指针,因此只检查您拥有的类型:int & = int *,这是无效的。

如果您将[0]添加到右侧,则会导致取消引用并产生左值,引用itab中的第一个元素,其类型为{ {1}},现在表达式有意义(类型明智),因为它是int

现在的问题是你没有在任何地方定义函数int & = int,所以链接器会抱怨。

  

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

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

z

答案 1 :(得分:2)

这是一个返回指向五个ints数组的指针的函数。