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

red*_*cap 4 c c++ arrays pointers

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

int a[10];

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

int *p2; p2 = a;

int (*p3)[10]; p3 = &a;
Run Code Online (Sandbox Code Playgroud)

p1,p2和p3有什么区别?他们非常困惑.

Jos*_*eld 9

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

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

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

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

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

?????????????????????????????????????????????????????????????
? int ? int ? int ? int ? int ? int ? int ? int ? int ? int ? 
?????????????????????????????????????????????????????????????
   ^
   ??? p1, p2, p3
Run Code Online (Sandbox Code Playgroud)

因此,如果您从所描述的全部指向开始然后递增它们,您会得到:

??????????????????????????????????????????????????????????????
? int ? int ? int ? int ? int ? int ? int ? int ? int ? int ? 
??????????????????????????????????????????????????????????????
         ^                                                     ^
         ??? p1, p2                                            ??? p3
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 5

p1指向第一个元素a.

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

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