• 两道指针难题


    两道指针难题

    题目一

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

    为了大家好理解 我画图解释下这一题

    在这里插入图片描述
    首先 我们画出a 这是一个二维数组

    紧接着 就轮到p了 p是一个数组指针 它指向一个4个元素的数组
    在这里插入图片描述
    这是它们两个分别表示的位置

    我们都知道 指针相减表示的是它们之间相差的元素 这里的元素相差是-4

    -4 以%d的形式打印就是-4

    而它在内存中储存的是补码 所以说打印形式是 fffffffc

    在这里插入图片描述

    题目二

    int main()
    {
     char *c[] = {"ENTER","NEW","POINT","FIRST"};
     char**cp[] = {c+3,c+2,c+1,c};
     char***cpp = cp;
     printf("%s\n", **++cpp);
     printf("%s\n", *--*++cpp+3);
     printf("%s\n", *cpp[-2]+3);
     printf("%s\n", cpp[-1][-1]+1);
     return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    首先 char*c[] 是一个指针数组 里面有四个指针 enter new point first
    如图
    在这里插入图片描述

    cp也是一个指针数组 里面有四个指针
    如图
    在这里插入图片描述
    最后的ccp也是一个指针

    指向的cp

    在这里插入图片描述
    第一个ccp++之后解引用 实际上指向了 c+2 再解引用打印出point

    因为这个时候前缀++ 实际上ccp的位置改变了

    第二题 首先对于ccp前缀++ 这个时候它的位置又改变了 变成了指向c+1

    再对c+1进行–操作之后解引用这个时候它的值也改变了 变成了c

    之后c+3 实际上从er开始了 打印出er

    第三题

    实际上是对于ccp-2之后解引用 再解引用 之后指针位置向后移动3

    打印出来是st

    在这里插入图片描述

    第四题实际上是 *((ccp-1)-1)+1

    在这里插入图片描述

    打印出来ew

    在这里插入图片描述
    实际上的结果也符合预期

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

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

    那么大家下期再见咯

  • 相关阅读:
    基于Python实现种差值方法
    【SpringCloud】LoadBalance负载均衡服务调用快速入门
    【无标题】
    k8s学习笔记-完整版
    最小最大表示法超详细讲解
    基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints
    学习笔记:SpringCloud 微服务技术栈_高级篇③_分布式缓存
    [附源码]计算机毕业设计JAVA小型银行贷款管理系统
    mybatis入门
    批处理文件(.bat)中,dir与tree命令的效果
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126990684