函数指针和指针函数

今天在看《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专家编程》上摘录

  1. 声明从他的名字开始读取,然后按照优先级顺序依次读取
  2. 优先级的顺序,由高到低依次是
    1. 声明中被括号括起来的那部分
    2. 后缀操作符
      • 括号() 表示这是一个函数
      • 方括号[]表示这是一个数组
    3. 前缀操作符
      • 星号*表示这是一个指向…的指针
  3. 如果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。到这里整个解析也就结束了!
后续,还会对这个问题进行更加深入的探讨…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值