OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5134|回复: 2

剖析下函数与指针,感兴趣的朋友可以顶一下

[复制链接]

2

主题

2

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-1-12
在线时间
28 小时
发表于 2013-4-4 12:33:33 | 显示全部楼层 |阅读模式
      当声明一个函数指针时,必须声明他所指向的函数类型。要指定函数类型,就要指出函数的返回值类型和函数的形参类型。例如 考虑下面的原型: void ToUpper(char*) 函数的类型是具有char*类型的参量,其返回值类型是void。要声明这种函数类型的指针可以这样做:  void (*pf)(char*) //pf是一个指向函数的指针   从这个声明中可以看出,第一对圆括号将运算符*和pf结合在了一起,这就意味着pf是一个指向函数的指针。这就使得(*pf)是一个函数,并使(char*)作为该函数的形参列表,void作为其返回值的类型。
      有了函数指针之后,可以吧适当类型的函数地址赋给它。在这种场合中,函数名可以用来表示函数的地址:
void ToUpper (char*);
void ToLower(char*);
int  round   (double);
void  (*pf) (char*);
pf=ToUpper;//合法,ToUpper是函数ToUpper()的地址
pf=ToLower;//合法,ToLower是函数ToLower()的地址
pf=round;//无效,round是错误类型的函数
pf=ToLower();//无效,ToLower()不是地址
最后一种赋值方式是不正确的,因为不能在一个赋值语句中使用一个void类型的函数。注意,指针pf可以指向任何接受一个char*参数并返回类型为void的函数,而不能指向具有其他地址特性的函数。
    正像可以使用一个数据指针访问数据一样,也可以使用函数指针来访问函数:
void  
ToUpper (char*);
void  
ToLower(char*);
void (*pf)(char*);
char mis[]=“Nina Merier”;
pf=
ToUpper;
(*pf)(mis);//把
ToUpper作用于mis(语法1)
pf=
ToLower;
pf(mis);//把
ToLower作用于mis(语法2)
  每种方法看起来都是有道理的,第一种方法:pf指向
ToUpper函数,*皮肤就是ToUpper函数,因为此表达式(*pf)(mis)与ToUpper(mis)一样。第二种方法:因为函数名是一个指针,可以互换使用指针和函数名,因此pf(mis)与ToLower(mis)一样。
      正如数据指针最常见的用法之一是作为函数的参数一样,函数指针最普遍的用法之一也是作为函数的参数。例如,考虑下面的原型:
void  show (void(*fp)(char*),char*str);
这看起来很混乱,但是它声明了两个参量fp和str。参量fp是一个函数的指针,str是一个数据指针。更具体一点,fp指向接受
一个char*参量且返回类型为void的函数,str指向一个char值。因此,给定前面的声明,可以使用像下面这样的函数调用:
show (ToLower,mis);//show()使用ToLower()函数:fp=ToLower
show (pf,mis);//show()使用由pf指向的函数:fp=pf
show()如何使用传递过来的函数指针呢?他使用语法fp()或是(*fp)()来调用函数:
void  show (void(*fp)(char*),char*str)
{
      (*fp)(str);//把所选函数作用于str
       puts(str);//显示结果
}
这里show()首先把fp指向的函数作用于字符串str来转换str,然后在显示转换后的字符串
与大家分享了函数与指针的关系,因为函数指针非常的强大,很难一语道破其中深奥的精髓,只有努力不断地学习,再难的东西也会慢慢的攻破!呵呵
 












正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-4 13:21:27 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-4 14:39:39 | 显示全部楼层
顶啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 02:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表