当我尝试使用 g++ 编译以下代码时:
int main()
{
int a[3] = {0, 1, 2};
int (* p)[] = &a;
}
编译器给出以下错误:“无法在初始化中将'int ( )[3]' 转换为 'int ( )[]'”。为什么不能将 int ( )[3] 转换为 int ( )[]?如果不可能,那么应该如何初始化“int (*)[]”类型的变量?
因为您必须指定指针指向的数组的长度。它应该是这样的:
int (* p)[3] = &a;
int (*p)[]
这意味着你p
是一个指向数组的指针。问题是编译器必须在编译时知道指针指向的数组有多长,因此您必须在括号中指定一个值 -> int (*p)[x]
where x
is known at compile time。
初始化类型变量的方法有很多int (*)[]
。例如,它可以由其他int (*)[]
类型的值(包括由显式强制转换产生的值)或空指针常量来初始化。一个int (*)[3]
值不会立即起作用,因为它具有不同的类型。
在你的情况下,我希望这是完全合法和定义的
int (*p)[] = (int (*)[]) &a;
与进一步的战斗作为(*p)[i]
。
你可以做你想做的事(比如用p[0]
,p[1]
和访问每个元素p[2]
):
int *p = a;
除非你真的想要一个指向指针的指针,在这种情况下使用:
int **p = &a;