• 指针的各种变形


    说起来曾经好像也没太过深入的了解指针,只停留在能使用的阶段,所以当出现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的指针










  • 相关阅读:
    1月10日 TextView
    1月9日 布局2
    30 Adapter适配器
    29 个人通讯录列表(一)
    28 ListView控件
    27 登录模板
    26 Activity的启动模式
    25 Activity的生命周期
    24 得到Activity返回的数据
    23 Activity的传值2(bundle)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4519333.html
Copyright © 2020-2023  润新知