2421|3

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

说下函数指针的用法 [复制链接]

在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址来调用数组数据,也可以使用指针变量指向函数代码的首地址来调用函数,指向函数代码首地址的指针变量就称为函数指针。

1.函数指针定义

函数类型 (*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定义函数指针时请注意:
   
函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。

2.函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如,

int func(int x);   /* 声明一个函数 */

int (*f) (int x);    /* 声明一个函数指针 */

把函数的地址赋值给函数指针,可以采用下面两种形式:
      
f=&func;            /* 将func函数的首地址赋给指针f */   
f=func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

3、下面给出一个示例程序:


#include
void (*fp)();
//函数指针: 指向函数的指针包含了函数的地址,可以通过它来调用函数

void (*fp_para)(char *);
//带参数的函数指针


void func_para(char *s);
void func();

int main(void)
{
    fp_para=&func_para;
//或者:fp_para=func_para;

    (*fp_para)("This is the parameter of the funtion!");

    fp=&func;
//或者:fp=&func;

    (*fp)();

    return 0;
}

void func_para(char *s)
{
    printf("%s\n", s);
}

void func()
{
    printf("This function has no parameter!\n");
}


此帖出自编程基础论坛

最新回复

本帖最后由 damiaa 于 2017-9-18 10:11 编辑   函数指针是C (不是说C++) 面向对象编程的基础。 值得研究。 在结构里面放函数指针就实现了一个结构 统一了 数据和代码的联系。有点像类了。有了类(结构实现的) 就好搞对象了。年轻的还没搞对象的可以玩一玩。 指针本身就是地址,一种芯片的内存地址都是一样的 比如ARM里的内存都是 4字节,这个无需说明,只有指针(地址)里面放的东西是变化的,有字符型的,有INT型的,还有浮点型的,等等。所以指针才有类型,指针的类型实际上是指存储内容的类型。函数指针也一样。指的就是返回值的类型。   详情 回复 发表于 2017-9-16 11:59
点赞 关注(1)
 

回复
举报

7462

帖子

2

TA的资源

五彩晶圆(高级)

推荐
 
本帖最后由 freebsder 于 2017-4-1 00:42 编辑

有两个需要纠正的和一个瑕疵。函数类型那里应该就是返回值,"函数类型"是整个函数的"样子"而不是最前面那一坨。括号那里,不是由于括号优先级高必须加括号,必须加括号的原因在于*与右边的名字一起作为一个单位才能表示一个指针,后面的括号参列表示是个函数,简单的说合起来才是我们常称的函数指针。如果没有括号,*就被前面的返回值类型用了,成了"返回一个什么什么指针的函数",此时*与右边的名字不作为一个单位。括号在这里是为了结合他两。 瑕疵是说对代码,一般称为入口地址,entry point,entry address, 而不说首地址。
此帖出自编程基础论坛

赞赏

1

查看全部赞赏

 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
楼主的分享不错,很适合新手。沙发纠正的也很棒
此帖出自编程基础论坛
 
 
 

回复

6069

帖子

4

TA的资源

版主

4
 
本帖最后由 damiaa 于 2017-9-18 10:11 编辑

  函数指针是C (不是说C++) 面向对象编程的基础。 值得研究。 在结构里面放函数指针就实现了一个结构 统一了 数据和代码的联系。有点像类了。有了类(结构实现的) 就好搞对象了。年轻的还没搞对象的可以玩一玩。
指针本身就是地址,一种芯片的内存地址都是一样的 比如ARM里的内存都是 4字节,这个无需说明,只有指针(地址)里面放的东西是变化的,有字符型的,有INT型的,还有浮点型的,等等。所以指针才有类型,指针的类型实际上是指存储内容的类型。函数指针也一样。指的就是返回值的类型。
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表