• 【C语言】指针和数组笔试题解析(2)


    【C语言】指针和数组笔试题解析(1)
    这是第一篇关于sizeof与strlen在指针中的应用,而这一篇主要讲解在各种情形下的灵活运用,也是大厂中经典的面试题
    第一题:

    int main()
    {
        int a[5] = { 1, 2, 3, 4, 5 };
        int *ptr = (int *)(&a + 1);
        printf( "%d,%d", *(a + 1), *(ptr - 1));
        return 0;
    }
    //程序的结果是什么?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    答案:

    2,5

    解析:

    &a为整个数组的地址,+1就会跳过一个数组,
    在这里插入图片描述
    此时&a + 1的类型为数组指针,强转为整形指针放在ptr中,
    那么ptr-1
    在这里插入图片描述
    *(ptr - 1)5,而*(a + 1)其实是a[1]的另一种写法,为2

    一一一一一一一一一分割线一一一一一一一一一一
    第二题:

    //由于还没学习结构体,这里告知结构体的大小是20个字节
    struct Test
    {
     int Num;
     char *pcName;
     short sDate;
     char cha[2];
     short sBa[4];
    }*p;
    //假设p 的值为0x100000。 如下表表达式的值分别为多少?
    //已知,结构体Test类型的变量大小是20个字节
    int main()
    {
     printf("%p\n", p + 0x1);
     printf("%p\n", (unsigned long)p + 0x1);
     printf("%p\n", (unsigned int*)p + 0x1);
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    答案:

    00100014
    00100001
    00100004

    解析:
    第一个printf

    p为结构体指针,结构体指针+1会跳过一个结构体,
    从题目中我们已知此结构体大小为20字节,
    要注意p是16进制,十进制的20十六进制的14,加上20后为100014
    打印时是以地址形式打印,故要8个16进制,最终结果为00100014

    第二个printf:

    p被强转为整形,
    整形+1就是+1,只有指针加减才是比较特殊的,
    然后以地址形式打印为00100001

    第三个printf:

    p被强转为整形指针,+1会跳过一个整形,即4
    结果为00100004

    一一一一一一一一一分割线一一一一一一一一一一
    第三题:

    int main()
    {
        int a[4] = { 1, 2, 3, 4 };
        int *ptr1 = (int *)(&a + 1);
        int *ptr2 = (int *)((int)a + 1);
        printf( "%x,%x", ptr1[-1], *ptr2);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    答案:

    4,2000000

    解析:

    ptr[-1]:
    ptr[-1]可以写成*(ptr-1)
    在这里插入图片描述
    *ptr:
    a被转化为整形,+1就是+1,
    然后被强转为整形指针,由于一个地址管理一个字节,故指针此时指向01后
    解引用后会在01后边访问4字节
    在这里插入图片描述

    一一一一一一一一一分割线一一一一一一一一一一
    第四题:

    #include 
    int main()
    {
        int a[3][2] = { (0, 1), (2, 3), (4, 5) };
        int *p;
        p = a[0];
        printf( "%d", p[0]);
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    答案:

    1

    解析:
    注意{}中是(),是逗号表达式,
    在这里插入图片描述

    p为第一行数组名,数组名[0]表示第一行第一个元素,即为1

    此贴·会持续更新,欢迎纠错与讨论

  • 相关阅读:
    5G时代来临,小程序将成为新的发展方向
    Linux上docker论坛的搭建
    Win10开机内存占用超80%?一招解决!
    9.19 Day 56----搭建Ngin
    Android 解析包时出现问题 的解决方案(应用检查更新)
    VSCode 调试 u-boot
    浏览器打不开解决方式
    fastjson很好,但不适合我
    oracle---一表向另一表循环插入数据过程中、发现异常并抛进日志表、直至数据传输完成
    python 解析xml
  • 原文地址:https://blog.csdn.net/2301_78636079/article/details/132921547