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
谢谢!
答案 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
数组的指针的函数。