关于C ++中的指针和数组

时间:2013-04-05 17:09:27

标签: c++ c arrays pointers

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

int a[10];

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

int *p2; p2 = a;

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

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

3 个答案:

答案 0 :(得分:9)

首先,a是一个10 int的数组。这很容易。

p1是“指向int的指针”。您正在为其分配&a[0]的值。这将获取a的第一个元素的地址。因此,p1现在指向a的第一个元素。

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

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

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

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ 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

答案 1 :(得分:5)

p1指向a的第一个元素。

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

p3被读作指向十个整数数组的指针。它指向a本身,递增它会使其向前移动sizeof(int) * 10而不是sizeof(int)

答案 2 :(得分:0)

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