C++ 将数组地址分配给指针

C++ Array address allocation to pointers

本文关键字:指针 分配 组地址 数组 C++      更新时间:2023-10-16

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

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;

类型差异

p的类型

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

int (*)[3],即指向3 int数组的指针。

p的类型:

int *p = arr;

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

因此,

在第一种情况下,

*p计算结果为 3 int s 的数组,即 int [3] .

在第二种情况下,

*p的计算结果只是一个int


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

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


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

要获得arr的最后一个元素,您必须在第二种情况下使用 *(p+2)p[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 的指针,作为数组到指针衰减的结果,它被初始化为指向 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]