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