【问题标题】:what it is: int (*z())[5];它是什么: int (*z())[5];
【发布时间】:2013-04-01 15:22:29
【问题描述】:
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 构建/调试/GNU-Linux-x86/main.o 构建/调试/GNU-Linux-x86/main.o: 在函数main': /NetBeansProjects/cppappl_example4/main.cpp:242: undefined reference toz()'

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


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

nice rule of spiral by David Anderson

and cdecl.org

谢谢!

【问题讨论】:

  • z 是一个不带参数的函数,它返回一个指向由 5 个 ints 组成的数组的指针。
  • @chris:螺旋法则……好吧,如果你能应用它,你就不需要它,如果你需要它,它会在复杂情况下失败。甚至可能很难找到从哪里开始螺旋!!!
  • @DavidRodríguez-dribeas,你能给我举个例子说明它在哪里不起作用。它帮助我弄清楚了自阅读以来我所看到的每一个复杂的声明。
  • @chris:问题在于规则过于简单化,要能够应用它,您需要了解的不仅仅是它所说的。如果您只是按照该页面中的定义,char * const a[10][10]; 的解释将是 a 是一个由 10 个数组组成的数组 const 由 10 个指向 char 的指针组成的数组...螺旋和何时不转换为 array of 10 array of 10 constant pointers to char,但这几乎不是 spiral... 我更喜欢从中心开始(名称)并向外增长,没有隐含的螺旋

标签: c++ arrays pointers function-pointers


【解决方案1】:
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&

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

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

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

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

没错,要不要是另一回事。 z 的可能定义是:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2015-08-07
      • 2020-02-21
      • 2018-03-25
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      相关资源
      最近更新 更多