今天在看《C专家编程》,结合今天上午做的嵌入式的笔试题,我在这里将函数指针和指针函数好好理一下。在此之前我们一定要理解汉语的表达方式:真正的名词在词语后半段,前半段都是在修饰。函数指针其实是指针,指针函数其实是函数,这样有助于我们理解。PS:数组指针和指针数组也是这样来从字面上区分的。
指针函数
这个比较简单,目的只是为了和函数指针区别开。指针函数我们经常写。
/*定义一个指针函数*/
char* f(int a){}
函数的返回值是一个指向char型数据的指针。
函数指针
函数指针其实就是指向函数入口地址的指针。
/* 声明一个函数指针 */
int (*foo) (int x);
...
/* 将func函数的首地址赋给指针f */
foo=func;
其中func函数中的参数为int型,返回值也是int型
理解C语言声明的优先级规则
小标题是我在《C专家编程》中看到的,觉得对于我们处理包含众多*符号的C语言很有帮助
For Example:试着分析下面C语言
char *const *(*next)();
我们先来看声明的优先级规则,从《C专家编程》上摘录
- 声明从他的名字开始读取,然后按照优先级顺序依次读取
- 优先级的顺序,由高到低依次是
- 声明中被括号括起来的那部分
- 后缀操作符
- 括号() 表示这是一个函数
- 方括号[]表示这是一个数组
- 前缀操作符
- 星号*表示这是一个指向…的指针
- 如果const ,volatile关键字的后面紧跟类型说明符(如int long),那么它作用于类型说明符。在其他情况下,const ,volatile关键字作用于它左边紧邻的*
依据上面的规则,我们来分析char * const *(*next)();这句声明
从名字next开始入手,括号里面的是一个指针,后缀是一个括号,所以,
next是一个指针,它指向一个函数;
再来分析前缀,char* const* ,我们可以将char* const看成A,将它简化成A*,将A看成一种数据类型。那么将会是这样:
A *(*next)(); ,
next是一个指针,它指向一个函数,这个函数返回另外一个指针
A数据类型其实是char * const,如果是char * const B,就表示指向B的常量指针;或者我们可以通过规则来判断出const作用于左边的*,所以表示指针常量,那么最后将会是这样
next是一个指针,它指向一个函数,这个函数返回另外一个指针,该指针指向一个类型为char的常量指针。
Nice。到这里整个解析也就结束了!
后续,还会对这个问题进行更加深入的探讨…