4

我想问一个关于 C++ 中的指针和数组的问题。

int a[10];

int *p1; p1 = &a[0];

int *p2; p2 = a;

int (*p3)[10]; p3 = &a;

p1,p2和p3有什么区别?他们非常混乱。

4

3 回答 3

9

首先,a是一个 10int秒的数组。那是容易的部分。

p1是一个“指向”的指针int。您正在为其分配 的值&a[0]。这需要 的第一个元素的地址a。所以p1现在指向 的第一个元素a

p2也是一个“指针int”。您a直接分配给它。在这种情况下,必须进行称为数组到指针转换的标准转换。基本上,数组可以转换为指向其第一个元素的指针。您将此转换的结果分配给p2. 所以p2也是指向第一个元素的指针a

p3是一个“指向 10 数组的指针int”。您正在获取数组的地址a并将其分配给此指针。所以现在这个指针指向数组本身(不是它的第一个元素)。

您可能会认为“第一个元素与数组具有相同的地址,那么有什么区别?” 事实上,当您尝试增加指针时,您会注意到不同之处。递增p1p2将为您提供指向数组第二个元素的指针。递增p3将为您提供指向下一个 10 ints 数组的指针(实际上并不存在)。

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │ int │ 
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
   ^
   └── p1, p2, p3

因此,如果您从所描述的所有指向开始,然后增加它们,您将得到:

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬┄
│ int │ int │ int │ int │ int │ int │ int │ int │ int │ int │ 
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴┄
         ^                                                     ^
         └── p1, p2                                            └── p3
于 2013-04-05T17:13:04.180 回答
5

p1指向 的第一个元素a

p2导致a衰减为指向第一个元素的指针,因此它也指向 的第一个元素a

p3被读取为指向十个整数数组的指针。它指向a自己,并且递增它会将其向前移动,sizeof(int) * 10而不是sizeof(int).

于 2013-04-05T17:12:08.370 回答
0

这些指针声明之间没有区别。它们都指向数组a[](索引0)的第一个元素。它们只是编写语句的不同风格。

于 2013-04-07T17:08:20.053 回答