• 对*P++的理解,再联想~~~


    前言:

         最近在看一位叫朱有鹏大神的视频,讲的甚好。应此,我的感悟也因此被激发,准备针对朱老师将的内容,结合自己的理解,写一个系列的笔记博客~~大家可以去www.zhulaoshi.org观看视频~~

    正文:

    *P++,这种用法是很常见的,很有用的。但是不是很好理解,现在
    来彻底分析下~~
        首先*号和++号的优先级是同一级,但是它们的结合方向是从右边到左边。
        那么很明显核心P先和++先结合,这个就确定了关键的一件事——++会让指针递增,而不是指针指向的数,
    也就是说会递增的是p而不是*p。
        但是这里的++,是后++。后++有个特点——++会在本条语句执行完之后执行。
    知道了,这些之后*P++就可以理解了,他就等价于:先执行*P,然后将P++。


    这里就很能体会到朱老师讲的:
    1、首先找核心。这里是P。(核心其实就是关键变量)
    2、然后找结合,先看核心离谁最近,再看核心更喜欢谁(优先级),结合之后就可以把结合形成的东西看成整体。
    如,这里就是P++;那么就是*(P++)。但是这里++的特殊性,会先执行*P,但是P++始终是整体,
    所以之后会执行P++,而不是(*P)++。

    数组指针与指针数组也是这么分析:
    int* p[];
    首先核心是p,再看p更喜欢谁~~
    []是最高优先级的运算符(小括号排名第二,但是我们知道[]里只能放常量,无法放变量,而核心往往是变量
    所以看上去小括号更牛逼些)。
    所以p先和[]结合,和[]结合之后就成了p[],很明显这是个数组,p[]再和*结合就成了*p[],
    就成了指针数组,应为p先[]结合,int* p[]的本质是个数组,然后数组内部存放的是int型的指针。

    再看数组指针:
    int(*p)[];分析流程还是遵循以上规则:
    首先找到核心p,小扩宽把p与[]隔开了,那么此时p和*最近,他们可以结合,且结合成*p,很明显*p是一个
    指针的形式,*p整体再和[]结合,这就成了数组指针,应为p先和*结合,所以他的本质是一个指针,这个指针
    指向了一个int型的数组。

    再看指针函数:
    int *add();
    首先核心是add,add先和优先级更高的小括号结合,就成了一个整体add(),很明显这是个函数。
    add()整个再和*结合,就是指针函数了。应为add先和小括号结合,所以他的本质是一个函数。
    一个能返回(一个int型)指针的函数。

    最后看函数指针:
    int (*add) ();此时add被一个小扩隔开了,此时add和*最近,他们先结合,所以int (*add) ()本质
    是一个指针,这个整体再和小括号结合,就成了函数指针。本质是指针,所以这个是一个指向函数的指针。
    (函数的特点是返回值为int,参数列表为空)

  • 相关阅读:
    odoo14系列笔记-基本进销存(二)
    odoo14系列笔记-基本进销存(一)
    PVE另一种方法使用中科大的镜像服务器 NGINX反向代理
    git 国内加速
    VirtualBox开启套娃模式-打开嵌套 VT-x/AMD-V 功能
    K8S集群安装(基于DEIBAN,proxmox)
    JS语法 ES6、ES7、ES8、ES9、ES10、ES11、ES12新特性
    8个非常实用的Vue自定义指令
    require和import的区别
    js异步加载之defer、async、type=module
  • 原文地址:https://www.cnblogs.com/douzi2/p/4933282.html
Copyright © 2020-2023  润新知