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()'
所以我的问题是:这个声明是否正确?如果是,那么它是什么,如何使用它?
编辑:答案中给出的链接确实有很大的帮助:
谢谢!
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)