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这四个字节的空间,后面以此类推)

alt

总结

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;
}
全部评论

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务