int数组的类型是什么?

时间:2014-12-19 12:27:42

标签: c++ arrays pointers

我正在阅读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]的类型是什么?

5 个答案:

答案 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的数组之间的区别。