结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以,标准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. Gerrit评审报错[remote rejected] develop- refs/for/develop(no new changes)
  2. Excel 2013中单元格添加下拉列表的方法
  3. Luogu P1031 均分纸牌(贪心)
  4. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
  5. 躺赚的意思不是做到高级别就觉得高枕无忧了
  6. SpringBoot的自定义配置方法一,通过自定义配置文件
  7. iOS开发中的HTML解析
  8. JavaScript表单验证年龄
  9. Django models Fild详解
  10. Day77_Flink(三)Flink时间语义和水印
  11. python调用gpu amd_TensorFlow使用AMD GPU实现加速(ROCm/Ubuntu 18.04)
  12. Python3开启自带http服务
  13. 【大规模MIMO学习笔记】大规模MIMO的信道特点
  14. 正则表达式行尾行首添加字符
  15. django操作word全程实录讲解(包含操作图片,内含代码下载地址)
  16. 【简约而不简单:神级代码的小秘密】| 第二章 栈
  17. 2017下半年软件测评师上午考试试题
  18. SQL service基础(九)用户定义数据类型和用户定义函数的概念、创建及使用方法
  19. Java异常(漂亮简洁的思维导图)
  20. 使用Python批量下载哨兵一号(sentinel-1)的精密轨道数据(precise orbit data)

热门文章

  1. AI 考生挑战高考作文,平均 1 秒生成 1 篇,水平超 75% 考生
  2. 在字节跳动工作是怎样的?
  3. 推荐免费收录外链的分类目录网站
  4. SOA推动电信服务走向融合应用
  5. c#和Python交互,完美解决Python调用OpenCV等第三方库以及分发时需配置python环境的问题
  6. 记录一次大学生受电话诈骗过程
  7. python中student和student_理解Python中的类与实例
  8. springcloud用feign消费服务记录
  9. JAVA培训班出来之后的面试经历
  10. Zeitgeist 2010: How the world searched - China (中国)