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

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务