4

当我尝试使用 g++ 编译以下代码时:

int main()
{
    int a[3] = {0, 1, 2};
    int (* p)[] = &a;
}

编译器给出以下错误:“无法在初始化中将'int ( )[3]' 转换为 'int ( )[]'”。为什么不能将 int ( )[3] 转换为 int ( )[]?如果不可能,那么应该如何初始化“int (*)[]”类型的变量?

4

3 回答 3

9

因为您必须指定指针指向的数组的长度。它应该是这样的:

int (* p)[3] = &a;

int (*p)[]这意味着你p是一个指向数组的指针。问题是编译器必须在编译时知道指针指向的数组有多长,因此您必须在括号中指定一个值 -> int (*p)[x]where x is known at compile time。

于 2013-07-02T18:35:07.840 回答
4

初始化类型变量的方法有很多int (*)[]。例如,它可以由其他int (*)[]类型的值(包括由显式强制转换产生的值)或空指针常量来初始化。一个int (*)[3]值不会立即起作用,因为它具有不同的类型。

在你的情况下,我希望这是完全合法和定义的

 int (*p)[] = (int (*)[]) &a;

与进一步的战斗作为(*p)[i]

于 2013-07-02T18:41:02.570 回答
-1

你可以做你想做的事(比如用p[0],p[1]和访问每个元素p[2]):

int *p = a;

除非你真的想要一个指向指针的指针,在这种情况下使用:

int **p = &a;
于 2013-07-02T18:35:16.627 回答