现在的位置: 首页 > 综合 > 正文

指针的各种变形

2018年04月03日 ⁄ 综合 ⁄ 共 1199字 ⁄ 字号 评论关闭

说起来以前好像也没太过深入的了解指针,仅仅停留在能使用的阶段,所以当出现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[]的话就很容易理解,但是其实是一样的,不管什么形式,都可以根据执行顺序来,首先[]得优先级要高于*,故第一步执行的是[]操作,也就表明f是个数组,第二步执行的是*操作,也就是说数据中取了下标后,也就是数组的某个元素,指向的是int,那么f就是一个数组,数组元素是指针,指向int

int (*f[])()

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

int *(*f[])()

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

抱歉!评论已关闭.