C/C++经典面试题

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

原文地址:https://www.cnblogs.com/Arthurian/p/8525422.html