zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    集合
    WPF自定义控件--模拟手机密码输入控件,在输入时显示最后一个输入密码字符
    配置VS不生成XML和PDB文件
    Wlan常见命令(可以查看连接密码)
    云栖社区用机器人爬CSDN的文章?
    Marshal.PtrToStringAnsi中文乱码
    各种手工DIY
    yii2修改默认控制器
    3D模型网站分享
    SemanticZoom配合GridView组件的使用关键点
  • 原文地址:https://www.cnblogs.com/Arthurian/p/8525422.html
Copyright © 2011-2022 走看看