• C指针与数组之间的细节


    看以下代码:

    #include <stdio.h>
    void f(char**);
    int main()
    {
        char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" };
        f(argv);
        return 0;
    }
    void f(char **p)
    {
        char *t;
        t = (p += sizeof(int))[-1];
        printf("%s
    ", t);
    }
    

     

    觉得执行后的值为多少呢?

    正确答案为: gh

    这里用到了double指针,也就是把指针的变量值传递给只接受指针参数的函数f(char**),函数里面的double 指针p最终结果是指向一个已经分配好值的数组单元。这个数组为["ab", "cd", "ef", "gh", "ij", "kl"]。

    定位到函数f(char **p),里面有一句话: t = (p += sizeof(int))[-1]。这里先将p指针移动一下位置,把p的地址递增了4个字节。由于最初的p指针指向了数组的第一个元素ab,这里移动了4个字节,那么就是从ab元素后面再数4个元素,也就定位到了ij元素。然后执行[-1]操作,这个操作等价于(p-1),意思是把指针往前面移动一个位置,也就是定位到了gh。注意了,一般看到p[-1]这种写法,其实把它看作(p-1)就好了。

    最后是输出结果,这里当然为gh。(前提是int类型等于4个字节)

  • 相关阅读:
    elasticsearch 相关命令
    Ubuntu server 修改系统时区
    js-eval运算符
    js-带操作的赋值表达式
    MVC模型绑定
    MVC部分视图的使用
    C#面试题-递归
    C#校验手机端或客户端
    AngularJs 中使用OpenLayer例子,手机端地图加载不显示问题
    C#后端调用WebApi地址
  • 原文地址:https://www.cnblogs.com/ranwuer/p/8391973.html
Copyright © 2020-2023  润新知