• 这样子来理解C语言中指针的指针


    友情提示:阅读本文前,请先参考我的之前的文章《从四个属性的角度来理解C语言的指针也许会更好理解》,若已阅读,请继续往下看。

    我从4个属性的角度来总结了C语言中的指针概念。对于C语言的一个指针,比如int *p,4个属性分别如下:

    C语言指针p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型);

    这4个属性用来理解C语言中单个指针可以,那么本篇再用这4个属性来解释C语言中的“指针的指针”。

    C语言中指针的指针,好多教材一般给出的定义是“变量的地址的地址”,或者是“指针的地址”,这满满的都是套路啊,理解一个地址就很难了,还地址的地址,深怕我们晕的还不够瓷实?好吧,先上一段代码,如下:

    #include <stdio.h>
    int main(void)
    {
    int a = 1; //定义一个普通的整型变量a,初始值是1
    int *p = NULL; //定义一个C语言的指针变量p,初始值是NULL;
    int **pp = NULL; ////定义一个C语言的指针的指针变量pp,初始值是NULL;
    p = &a; //指针p的值是变量a的地址;
    pp = &p; //指针的指针pp的值是变量p的值;
    printf("整型变量a的值是%d, 整型变量a的地址是%x
    ", a, &a); //输出变量a的值和变量a的地址
    printf("指针p的地址是%x, 指针p的值是%x, 整型变量(*p)的值是%d
    ", &p, p, *p); //输出变量p的地址,变量p的值,变量p指向的值
    printf("指针的指针pp的值是%x, 整型变量(*pp)的值是%x
    ", pp, *pp); //输出变量pp的值,pp指向的值
    return 0;
    }

    代码的含义已经在代码注释中写出来了。看上去有点晕啊,又是“地址”,又是“指针”的,还有“指针的指针”。。。。。。

    再贴个运行的结果,如下:

    对此结果做个解释:

    1.有一块内存区域,它的名字叫“a”,它的地址是“22fee8”,里面存了一个值“1”;

    2.又有一块内存区域,它的名字叫“p”,它的地址是“22fee4”,里面存了一个值“22fee8”;

    3.又又又有一块内存区域,它的名字叫“pp”,里面存了一个值“22fee4”;

    好了,现在咱就用那4个属性来分析下C语言指针p和指针的指针pp。先看下指针的指针pp。套用4个属性:

    C语言指针的指针pp=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型)

    将每个属性具体化,在本文中就是:

    C语言指针的指针pp=(22fee4,p,22fee8,int)

    哈哈,有没有看出什么名堂出来?

    第1个属性值“22fee4”是指针的指针pp自己的值,一般没什么用处,所以不用去关心。从第2个属性开始,也就是:p,22fee8,int,这些都是指针p的属性啦,如下图所示:


    那么:

    C语言指针的指针pp=(22fee4,p,22fee8,int)可以写为:

    C语言指针的指针pp=(22fee4,指针p的第1个属性,指针p的第1个属性的值,指针p的第4个属性);

    也就是从第2个属性开始,就可以抛弃指针的指针pp,不用去想这个pp了,请完全用指针p的思维来考虑问题。

    好了,现在再从4个属性来考虑指针p:

    C语言指针的指针p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型);

    再将每个属性具体化,就是:

    C语言指针的指针p=(22fee8,a,1,int);

    哈哈,又看出啥名堂来了吧?

    第一个属性值“22fee8”是指针p自己的值,一般也没什么用处,所以也不用去关心。从第2个属性开始,也就是:a,1,int就是变量a的属性啦,如下图所示:



    那么:

    C语言指针的指针p=(22fee8,a,1,int)可以写为:

    C语言指针的指针p=(变量a的第1个属性的值,变量a的第2个属性,变量a的第3个属性的值,变量a的第4个属性);

    也就是从第2个属性开始,就可以抛弃指针p,不用去想这个p了,请完全用变量a的思维来考虑问题。

    所以啊,指针的指针pp,指针p,变量a,三者的关系是pp的属性包含着p的属性,p的属性包含着a的属性,我们只需要像剥洋葱那样,一层一层地拨开,就会发现最终的变量a了。


    本文为作者原创,非独家,欢迎转发并关注ShiXP的微博:weibo.com/520JDH

  • 相关阅读:
    全世界最好听的钢琴曲
    清华“70后”院长刘云浩——生命在于运动,梦想从未止步 | 新“清”年特辑
    Android---60---Notification 通知栏的简单使用
    面向对象的三大特性
    一道淘汰85%面试者的百度开发人员面试题?
    Linux下基于Erlang的高并发TCP连接压力实验
    2014南瑞暑期实习面试笔试经历
    Oracle cloud control 12c 怎样改动sysmanpassword
    JEECG社区 一个微信教育站点案例源代码分享
    stm32智能小车之路之小车启动
  • 原文地址:https://www.cnblogs.com/itblog/p/7236556.html
Copyright © 2020-2023  润新知