1、指向数组的指针 和 指向数组首元素的指针
2018-03-07
昨天在牛客上看到这么一道C语言面试题,挺经典的,特来分享给大家。
程序如下,问输出结果
#include <stdio.h> int main () { int a[5] = {1,2,3,4,5}; int *p = (int*)(&a + 1); printf("%d %d" , *(a + 1), *(p - 1)); }
*(a+1)其实很简单,指的就是a[1],输出2,没问题。关键就在于这个第二个输出*(p-1)是多少?
学过C语言的都知道,数组名就是指向数组首元素的指针,那么对数组名进行取地址操作得到的是什么呢?对数组名 a 取地址得到的是指向数组的指针!!!(注意:不是指向数组首元素的指针)。也就是说 &a 是数组指针,类型为 (int*)[5],而指针加一要根据指针的类型进行偏移,&a 是长度为5的 int 数组指针,所以需要偏移 5 * sizeof(int),所以也就是 a[5] 的位置,另外需要注意 p
与(&a + 1)
类型是不一样的,这点非常重要,所以p - 1
只会减去 sizeof(int*)
,a
,&a
的地址是一样的,但意思就不一样了,a
是数组首地址,也就是a[0]
的地址,&a
是对象(数组)首地址,a+1
是数组下一元素的地址,即a[1],
&a+1
是下一个对象的地址,即a[5]
。
ps:a是 int 型指针,&a 是 int[] 型指针
到这里,答案也就不言而喻了,输出结果分别为 2和 5。
持续更新
作者:耑新新,发布于 博客园
转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com