C/C++数组元素引用题目解析
若有说明语句“int a[10],*p=a;”,对数组元素的正确引用是
https://www.nowcoder.com/questionTerminal/914aae5f0ee14c03b571455bbeb27a9d?toCommentId=12462104
题目
若有说明语句“int a[10],*p=a;”,对数组元素的正确引用是
- a[p]
- p[a]
- p+2
- *(p+2)
解析
int a[10];
声明了一个连续空间大小为10个整型大小(我的32位编译器下是10*4Byte)的int数组,数组起始位置的指针为a,也就是说a存储的是起始位置。
int* p = a;
声明一个int指针,指向a所指向的位置,也就是说p存储的内容和a是相同的,都是数组起始地址。
对于数组中元素的访问引用,一般可以通过 数组首地址[偏移量] 访问,也就是a[2]这样子;
也可以通过移动指针 *(数组首地址+偏移量) 访问,也就是*(a+2)这样。因为数组空间是顺序的,a+2表示距离首地址两个int类型大小的空间的地址,即数组的第三个元素的地址。根据指针的知识,访问指针指向地址的内容时,需要给地址变量加上*号,这就是*(p+2)中*号的由来。
各种访问的异同参见下图,直观明了。
(可以看到我这里一个int空间为4个字节,声明的数组的首地址为6487536,也就是说第一个元素占用了6487536、6487537、6487538、6487539四个字节,第二个元素占用了6487540、6487541、6487542、6487543这四个字节的空间,后面以此类推)
总结
a=p
*a=a[0]=*p=p[0]
*(a+2)=*(p+2)=a[2]=p[2]
&a[2]=&p[2]=a+2=p+2
代码验证
#include<stdio.h>
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
printf("a=%d\n",a);
printf("p=%d\n",p);
printf("a[0]=%d\n",a[0]);
printf("p[0]=%d\n",p[0]);
printf("*a=%d\n",*a);
printf("*p=%d\n",*p);
printf("a+1=%d\n",a+1);
printf("p+1=%d\n",p+1);
printf("*(a+2)=%d\n",*(a+2));
printf("*(p+2)=%d\n",*(p+2));
return 0;
}