1
int (*z())[5];

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

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

这给出了错误:

错误:从 'int*' 到 'int' 的无效转换</p>

所以我想啊哈,所以我很接近并尝试了:((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 toz()'

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


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

大卫安德森的螺旋法则

和 cdecl.org

谢谢!

4

2 回答 2

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],产生一个左值引用到第一个元素,因此 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;
}
于 2013-04-01T15:24:16.443 回答
2

它是一个函数,它返回一个指向由 5 组成的数组的指针ints

于 2013-04-01T15:24:24.287 回答