这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础

引言

指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序。我们要记住指针是一个指向内存地址的变量。指针可以引用如int、char……常见的数据类型,例如:

int * intptr; // 声明一个指向整型值的指针

int intval = 5 ; // 定义一个整型变量

intptr = & intval ; // intptr现在包含intval的地址

指针不仅仅指向常规的类型还可以指向函数

函数指针

函数指针的内容不难理解,不再赘述,参见《C语言函数指针的用法》

语法

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

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

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

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

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

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

结构体中的函数指针

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

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

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

typedef struct _str {

int result ; // 用来存储结果

Operation opt; // 函数指针

} STR;

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

//a和b相加

int Add (int a, int b){

return a + b ;

}

//a和b相乘

int Multi (int a, int b){

return a * b ;

}

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

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 ;

}

运行结果如下:

the result is 8

the result is 15

完整的代码如下:

#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 ;

}

来源:https://www.cnblogs.com/wuyudong/p/function-pointer-in-c-struct.html

c语言中函数指针用法,C语言函数指针的用法相关推荐

  1. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  2. 关于linuxC语言中创建进程,利用execlp函数执行.c程序问题

    关于linuxC语言中创建进程,利用execlp函数执行.c程序问题 对于一个小白来说,这个系统调用真的太难了,完全摸不着头脑啊,一搜execlp函数,全是执行的命令,什么传参硬是没懂. 不过说到底, ...

  3. 在C语言中以编程的方式获取函数名

    在C语言中以编程的方式获取函数名 仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧. 对象反射库.调试工具及 ...

  4. c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  5. verilog语言中的@什么意思 verilog语言中的@什么意思

    verilog语言中的@什么意思 verilog语言中的@什么意思 2012-05-27 22:47 在英语中@ 读at,也就是在--的时候,这个小学应该学过,对吧.verilog中@ 的含义就是触发 ...

  6. c加加属于面向对象的程序设计语言吗,下列语言中属于面向对象的程序设计语言是______。A、Visual BasicB、PASCALC、CD、FORTRAN...

    下列语言中属于面向对象的程序设计语言是______.A.Visual BasicB.PASCALC.CD.FORTRAN 更多相关问题 经纬仪如存在指标差,将使观测结果出现( ). 德治的约束作用主要 ...

  7. c语言中结构体类型定义的函数指针,结构体中定义函数指针

    结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...

  8. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

  9. scanf在c语言中的作用,c语言中scanf的基本用法

    前言 scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单: 1 int a; 2 scanf("%d",&a); ...

  10. C语言中常见的四个内存函数

    前言 我们为什么要用内存操作函数? 内存函数,是通过访问地址的方式操作对象,因此可应用于任何类型对象,只要按照字节操作 1. memcpy void * memcpy ( void * destina ...

最新文章

  1. 【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第二步)(4)...
  2. 二十年最强悍病毒排行榜
  3. Hive和HBase
  4. 前端获取当前url路径
  5. matlab积分使用
  6. Linux timeout命令的使用:timeout - run a command with a time limit
  7. 数据库-linux安装mysql
  8. android 绑定类名,Android Studio为Class跟Activity等添加注解
  9. python绘制一棵樱花树
  10. PyTorch绘制训练过程的accuracy和loss曲线
  11. Linux 内存管理(一)——地址空间
  12. VirtualDub
  13. 20行Python小程序批量删除GitHub仓库,包
  14. 博弈论系列—海盗分金币
  15. 分享Python采集99个VB源码,总有一款适合您
  16. 将MongoDB添加到windows服务中
  17. 《数字进化论——2020中国企业服务数字智能生态白皮书》发布预告
  18. 02 从亚马逊的实践,谈分布式系统的难点
  19. 请问如何判断一段文本中是否含有词典中的词语,并且把它们统计出来呀,有无大神赐教呀!!!
  20. 行到水穷处,坐看云起时。忽然明白

热门文章

  1. linux安装思源字体下载,fedora25安装字体-以思源字体为例 适合中文用户
  2. Android 阿里云热修复
  3. JAVA微信小程序论坛系统毕业设计 开题报告
  4. linux efi分区安装grub2,编译UEFI版本Grub2引导多系统文件efi
  5. 阿里矢量库(各种图标搜索功能)
  6. 霍夫丁不等式及其他相关不等式证明
  7. 微信公共号给客户发送消息提醒/模板消息(如业务到期提醒 ,订单提醒,帐户变动提醒)
  8. CSS 标签权重判断的方式
  9. win10计算器_从0开始自制计算器!
  10. 计算机无法安装蓝牙驱动,windows10系统安装蓝牙驱动图文教程|windows10系统如何安装蓝牙驱动...