C ++对指针的数组地址分配

时间:2016-07-15 06:31:58

标签: c++ arrays pointers

我对指针的概念很陌生,最近发现了这行代码:

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

上述代码行之间的区别是什么:

int arr[]={1,2,3};
int *p = arr;

为什么会出错:

int arr[]={1,2,3};
int *p = &arr;

2 个答案:

答案 0 :(得分:4)

类型差异

int (*p)[3] = &arr; 的类型
int (*)[3]

3,即指向int p s数组的指针。

int *p = arr; 的类型:

int*

只是int,即指向*p的指针。

因此,

在第一种情况下,

int评估为3个int [3]的数组,即*p

在第二种情况下,

int只评估arr

要获取(*p)[0]的第一个元素,您必须在第一种情况下使用p[0][0]arr

要获取*p的第一个元素,您必须在第二种情况下使用p[0]arr

要获取(*p)[2]的最后一个元素,您必须在第一种情况下使用p[0][2]arr

要获取*(p+2)的最后一个元素,您必须在第二种情况下使用p[2]或{{1}}。

答案 1 :(得分:2)

他们只是不同的事情。

int arr[]={1,2,3};
int (*p1)[3] = &arr; // pointer to array (of 3 ints)
int *p2 = arr;       // pointer to int

p1是指向数组(3个整数)的指针,然后初始化为指向arrp2是一个指向int的指针,作为array-to-pointer decay的结果,它被初始化为指向arr的第一个元素。

然后您可以将它们用作:

(*p1)[0]; // same as arr[0]
p1[0][1]; // same as arr[1], note p1[1] will be ill-formed.
p2[0];    // same as arr[0]