我正在阅读C ++中的数组。我尝试了以下代码:
int main()
{
int a[10];
int *p;
p = &a;
}
我遇到了编译错误:
pointers.cpp:10:6: error: cannot convert ‘int (*)[10]’ to ‘int*’ in assignment
p = &a;
为了理解能够分配给指针的数组类型,我尝试了这段代码:
int main()
{
int a[10];
int *r[10];
r = a;
}
编译错误:
: error: incompatible types in assignment of ‘int [10]’ to ‘int* [10]’
r = a;
然后我尝试了这个:
int main()
{
int a[10];
int *r[10];
r = &a;
}
编译错误:
error: incompatible types in assignment of ‘int (*)[10]’ to ‘int* [10]’
r = &a;
int (*)[10]
的类型是什么?
答案 0 :(得分:3)
int (*)[10]
是指向10 int
个数组的指针。它指向整个阵列。在您的第一个代码中,当您执行&a
时,您将获得具有此类型的整个数组的地址。如果你想存储它,你必须写:
int (*r)[10] = &a;
在您尝试的代码中,int *r[10]
是一个指针数组(而不是指向数组的指针)。
另一方面,int*
指向一个int
。例如,您可以获取某个数组元素的地址&a[0]
,它将是int*
。
int *p = &a[0];
实际上,数组的名称经常会进行一种称为数组到指针转换的隐式转换,其中它成为指向数组中第一个元素的指针。我们通常说数组衰减指向其第一个元素的指针。
int *p = a; // Here, a is decaying
答案 1 :(得分:2)
正确的方法是传递第一个元素的地址:
int a[10];
int *p;
p = &a[0];
可以通过递增p
:
p++;
答案 2 :(得分:2)
int数组的类型是什么?
每种尺寸都有不同的类型。例如,十个数组的类型是int[10]
。还有一个不完整的类型int[]
,代表一个未知大小的数组。
int(*)[10]的类型是什么?
这是指向大小为10的数组的指针。
在您的第一个代码段中,&a
是指向数组的指针,您无法将其分配给指向单个int
的指针,因为int
和{{ 1}}是不兼容的类型。在其他示例中,int[10]
是一个指针数组,您无法为数组指定任何内容。
你可以使用以下任何一种:
r
指定指向数组第一个元素的指针。或者如果你想要一个指向数组的指针(在其类型中保持大小),那就是
int *p = a; // implicit array-to-pointer conversion
int *p = &a[0]; // explicitly take address of element
额外的int (*p)[10] = &a;
表示这是一个指向数组的指针,而不是一个指针数组。
答案 3 :(得分:1)
你只需要做
int a[10];
int *p;
p = a;
分配p数组a的地址; i-e第一个元素的地址。
答案 4 :(得分:0)
正如错误所述,int (*)[10]
,因此您应该使用int (*r)[10]
而不是int *r[10]
。额外的()
是指向10个int数组的指针和10个指向int的数组之间的区别。