• 指针笔试题


    笔试题目一

    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首先a代表的是数组首元素的地址 加上一就是代表的2的地址
    对其解引用就可以得到2这个元素
    2 而ptr拿到的是整个数组的地址再加一 所以指向五后面一个元素
    而随后又被强转成int类型的指针了 所以移动的范围变成了一个元素
    所以说 最后向前移动一位 变成指向元素5
    所以说 最终的结果是2 5

    在这里插入图片描述

    笔试题目二

    struct Test
    {
     int Num;
     char *pcName;
     short sDate;
     char cha[2];
     short sBa[4];
    }*p = (struct Test*)0x100000;
    
    int main()
    {
     printf("%p\n", p + 0x1);
     p是一个指针 指针的大小是20 所以这个时候应该是加上20 变成0x100014
     printf("%p\n", (unsigned long)p + 0x1);
     这里是变成一个整型 实际上加上的数字就是1 所以应该变成0x100001
     printf("%p\n", (unsigned int*)p + 0x1);
     这里变成一个int类型的指针 所以应该变成 0x100004
     return 0;
    }
    
    

    我们首先要明确 0x1是一个十六进制数字1

    答案如下

    在这里插入图片描述

    笔试题目三

    int main()
    {
        int a[4] = { 1, 2, 3, 4 };
        int *ptr1 = (int *)(&a + 1);
        首先取地址a是取出整个数组的地址 加上1之后指针指向4
        所以说指向4后面一个元素  所以说ptrl{-1}应该是指向4
        int *ptr2 = (int *)((int)a + 1);
        下面这个我们就要画图来解释了
        printf( "%x,%x", ptr1[-1], *ptr2);
        return 0;
    }
    
    

    要求上面代码输出的结果

    在这里插入图片描述
    这个时候指针指向的00 我们读取一下这个数据的内存
    答案应该是02 00 00 00

    笔试题目四

    要求以下程序的输出结果

    int main()
    {
        int a[3][2] = { (0, 1), (2, 3), (4, 5) };
        int *p;
        p = a[0];
        printf( "%d", p[0]);
     return 0;
    }
    
    '
    运行

    这个其实是一个逗号表达式 里面真正的内容应该是 1 3 5 0 0 0
    输出的结果应该是第一行首元素 应该是1

    笔试题目五

    int main()
    {
        int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int *ptr1 = (int *)(&aa + 1);
        这里取地址代表拿到的是一整个数组的地址 加上一就到十的后面 后面减取一之后指向的就是十
        int *ptr2 = (int *)(*(aa + 1));
        这里首先aa是首元素地址 再二维数组中就是第一行的地址 加上1之后变成
        printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
        return 0;
    }
    
    

    所以说 输出的结果是十 五
    在这里插入图片描述

    笔试题目六

    int main()
    {
    	char* a[] = { "work","at","alibaba" };
    	char** pa = a;
    	pa++;
    	printf("%s\n", *pa);
    	return 0;
    }
    
    '
    运行

    这里首先a是一个指针数组

    里面的每一个元素其实都是一个指针

    用pa来接受a这个数组的首元素地址 其实也就是work的地址

    pa++之后 指向at 这个指针

    所以说打印出来的结果是at

    以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

    不吝赐教 在评论区或者私信指正 博主一定及时修正

    那么大家下期再见咯

  • 相关阅读:
    vue中父组件给子组件传递了参数后,什么时候确保子组件中收到的参数更新了
    如何在不失去理智的情况下调试 TensorFlow 训练程序
    九、线程池 Executor(半成品,后续继续更新...)
    【技术积累】Linux中的命令行【理论篇】【一】
    12_C++_《结构体和文件》_笔记整理
    【SpringMVC】解决获取请求参数的乱码问题
    微博撰写-流程图-序列图-甘特图-mermaid流程图-效果不错
    评价——TOPSIS
    实践总结:一篇搞懂链表——单链表和双指针技巧
    介绍油封的存放方法?
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126963224