结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展。那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。

函数指针

函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。

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

注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

要声明一个函数指针,使用下面的语法:

1Return Type ( * function pointer's variable name ) ( parameters )

例如声明一个名为func的函数指针,接收两个整型参数并且返回一个整型值

1int (*func)(int a ,int b ) ;

可以方便的使用类型定义运用于函数指针:

1typedef int (*func)(int a ,int b ) ;

结构体中的函数指针我们首先定义一个名为Operation的函数指针:

1typedef int (*Operation)(int a ,int b );

再定义一个简单的名为STR的结构体

1

2

3

4

5typedef struct _str {

int result ;// 用来存储结果

Operation opt;// 函数指针

} STR;

现在来定义两个函数:Add和Multi:

1

2

3

4

5

6

7

8//a和b相加

int Add (int a,int b){

return a + b ;

}

//a和b相乘

int Multi (int a,int b){

return a * b ;

}

现在我们可以写main函数,并且将函数指针指向正确的函数:

1

2

3

4

5

6

7

8

9

10int main (int argc ,char **argv){

STR str_obj;

str_obj.opt = Add;//函数指针变量指向Add函数

str_obj. result = str_obj.opt(5,3);

printf (" the result is %d\n", str_obj.result );

str_obj.opt= Multi;//函数指针变量指向Multi函数

str_obj. result = str_obj.opt(5,3);

printf (" the result is %d\n", str_obj.result );

return 0 ;

}

运行结果如下:

1

2the result is 8

the result is 15

完整的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28#include

typedef int (*Operation)(int a,int b);

typedef struct _str {

int result ;// to sotre the resut

Operation opt;// funtion pointer

} STR;

//a和b相加

int Add (int a,int b){

return a + b ;

}

//a和b相乘

int Multi (int a,int b){

return a * b ;

}

int main (int argc ,char **argv){

STR str_obj;

str_obj.opt = Add;//函数指针变量指向Add函数

str_obj. result = str_obj.opt(5,3);

printf ("the result is %d\n", str_obj.result );

str_obj.opt= Multi;//函数指针变量指向Multi函数

str_obj. result = str_obj.opt(5,3);

printf ("the result is %d\n", str_obj.result );

return 0 ;

}

c语言 一个函数返回结构体指针,详解C语言结构体中的函数指针相关推荐

  1. c语言数据类型int的用法,C语言基本数据类型:整型(int)用法详解|C语言学习

    C语言基本数据类型:整型(int)用法详解 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.以后, ...

  2. c++指针详解_c语言详解sizeof

    一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等. 它并不是函数. sizeof操作符以字节形式给出了其操作数的存储大小. 操作数可以是一个表达式或括在括 ...

  3. c语言指针常量和常量指针,详解C语言中的常量指针和指针常量

    概述对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区 ...

  4. deepdiff函数返回_Linux diff命令详解

    diff(difference)命令常用来比较两个文件中的内容.diff 命令在最简单的情况下,比较两个文件的不同.如果使用"-"代替"文件"参数,则要比较的内 ...

  5. 详解RAI I、C++中的智能指针以及一些常见的面试题

    RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存.文件句柄.网络连接.互斥量等等)的简单技术. 用法 RA ...

  6. Python re 模块findall() 函数返回值展现方式详解

    findall 函数: 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表. 注意: match 和 search 是匹配一次 findall 匹配所有,mat ...

  7. 详解c语言main函数、printf函数、scanf函数与va家族

    C语言入门与提升(1)--详解c语言main函数.printf函数与scanf函数,与va家族 前言: 为什么要学习C语言呢?C语言作为最古老的语言之一,走过了半个多世纪的风风雨雨,至今仍然长盛不衰, ...

  8. 一个获取ip地址的命令详解

    今天在看师兄写的一个安装脚本文件,虽然之前学了不少bash知识.不是太熟练,打算练练手,可是这个命令折磨了我好久.索性花点时间把它弄清楚.awk这个工具语言的难度,我是体会到了.写正则表达式的都是什么 ...

  9. mysql安装后目录介绍,MySQL安装后的目录结构及配置文件详解

    MySQL安装后的目录结构及配置文件详解 MySQL安装后的目录结构及配置文件详解 MySQL目录结构说明 MySQL 安装完成后,会在磁盘上生成一个目录,该目录就被称为 MySQL 的安装目录. M ...

最新文章

  1. Linux 交叉编译简介
  2. canvas arcTo()用法详解 – CodePlayer
  3. Aop获取bean的过程---spring debug
  4. Vert.x中EventBus中的使用
  5. HBase最佳实践-读性能优化策略
  6. Spark源码分析之BlockManager通信机制
  7. 正则表达式和Java编程语言1zz
  8. 华为机试HJ27:查找兄弟单词
  9. C++ ------------------------- 文件的复制
  10. 替代密码的c语言程序,替代密码及置换密码的C语言实现.doc
  11. 【C++】R进制转10进制,10进制转R进制
  12. php apk 分包,H5打包出APP,分包
  13. dubbo源码解析-cluster
  14. 防火墙如何打开和关闭某个端口
  15. JSP教程|1小时玩转JSP网站开发技术
  16. Android keyevent值中文表
  17. linux 路由器 漏洞,多个Linksys EA系列路由器信息泄露漏洞(CVE-2014-8244)
  18. ZOJ4105 Abbreviation
  19. Python pivot详解
  20. MEMS电容式加速度传感器(简介)-传感器专题

热门文章

  1. 用批处理文件在注册表中添加开机启动项
  2. 威固的MOM,你的WOW 「 WOW 手武之道」威固巅峰技术交流赛圆满收官
  3. 下载的时候 ed2k与BT到底有什么区别
  4. 网购秒杀系统架构案例分析
  5. SSM+JSP+Bootstrap+Ajax小实例(员工CRUD系统)(五:员工查询前后端(请求返回json的方式))
  6. 2023中国(江西)国际餐饮产业博览会,2月26日开幕
  7. 输出Unicode码中的汉字
  8. 实际中常用的一个随机数产生器
  9. win7关机快捷键_一天一个关机小技巧
  10. zbg是什么意思_ZBG什么意思?