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