zoukankan      html  css  js  c++  java
  • 指针的各种变形

    说起来曾经好像也没太过深入的了解指针,只停留在能使用的阶段,所以当出现int *(*f[])()这样的表达式的时候,我也基本上就是跪了。。。

    近期在看《C和指针》这本书,不得不说,它讲的还是非常透彻的,故在博客中记录一下,以后也方便复习~

    推断指针的方法是把申明的那段语句看成一个表达式,然后再一步一步确定。看样例非常好懂

    int f

    毫无疑问,f是一个整形变量

    int *f
    这一般也没问题,是一个指向整形的指针,但曾经我们都是直接死记的,如今换个方式,把它看成一个表达式,该表达式第一步运行的是*f, 表示*f是一个int型,故f是一个指向整形的指针

    int* f, g
    看到这种声明,不要以为用int* 去声明了f和g两个变量,还是要把它看成表达式,那么运行顺序是int (*f), g,运行顺序我用括号表示出来了,这种话就非常明显,f是指针,f是整形变量

    int f()
    当然这是一个函数,返回的是int

    int *f()
    尽管能一眼看出函数返回的是一个指向int的指针,但我们还是从表达式方面来看,由于之后的声明就没这么显而易见了,该表达式首先运行的是f(),故f肯定是一个函数,然后运行的是*f(),说明函数的返回值指向的是一个int

    int (*f)()
    这个事标准的函数指针的定义,可是不须要硬记住,我们这样来理解,依据运行顺序,首先第一个运行的是(*f),表明f肯定是一个指针,第二个运行的是最右边的括号,表明(*f)是一个函数,故此f是一个指针,指向函数,该函数没有不论什么參数,返回类型是int

    int *(*f)()
    这样的想要一眼看出来的话就比較难了,还是依照运行顺序,第一步(*f)表明f是一个指针,第二不(*f)()表明*f是一个函数,第三步*(*f)() 定义为int,表明该函数返回值是一个指向int的指针,故此f是一个指向函数的指针,该函数没有不论什么參数,返回类型是指向int的指针

    int f[]
    明显这是一个数组

    int  *f[]
    预计写成int*  f[]的话就非常easy理解,可是事实上是一样的,无论什么形式,都能够依据运行顺序来,首先[]得优先级要高于*,故第一步运行的是[]操作,也就表明f是个数组,第二步运行的是*操作,也就是说数据中取了下标后,也就是数组的某个元素,指向的是int,那么f就是一个数组,数组元素是指针,指向int

    int (*f[])()
    这种表达式基本不可能一眼看出来了。。。第一步运行[]操作,表明f是个数组,第二步进行*操作,表明数组元素是指针,第三步进行最右边的()操作,表明指针指向的是一个函数,最左边的int表明函数的返回值,故此f就非常明白了,f是一个数组,数组元素是函数指针,指向的函数无參数且返回int类型


    int *(*f[])()
    这个声明仅仅比上面一个多了第四步,第三步是最右边的()操作,表明在进行函数调用,第四步进行*操作,表明函数返回的进行*操作之后是个int,故能够知道函数返回的是一个指向int的指针










  • 相关阅读:
    on() 和 click() 的区别
    net core swagger
    sgen.exe 未能运行
    SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
    net core 实现简单爬虫—抓取博客园的博文列表
    javascript基础 方法
    android通过httpClient请求获取JSON数据并且解析
    发布到IIS的时候用户 'WWW-6743CC520E9ASPNET' 登录失败
    WebServices生成发布过程及常见问题的解决方法
    Android、iPhone和Java三个平台一致的加密工具
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4519333.html
Copyright © 2011-2022 走看看