c语言中结构体类型定义的函数指针,结构体中定义函数指针
结构体指针变量的定义
定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;…};struct 结构体标识符 *指针变量名;变量初始化:struct 结构体标识符 变量名={初始化值1,初始化值2,…,初始化值n };形式2:在定义类型的同时定义变量struct 结构体标识符{ 成员变量列表;…} *指针变量名;形式3:直接定义变量,用无名结构体直接定义变量只能一次struct{ 成员变量列表;…}*指针变量名;其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。函数指针的定义一般的函数指针可以这么定义: int (*func)(int,int);表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:int add2(int x,int y){ return x+y;}那么在实际使用指针func时可以这样实现:func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同printf("func(3,4)=%d\n",func(3,4));事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.typedef int (*FUN)(int,int); //参考下面
/* typedef int (*funcptr)(); 这个的意思是:定义一个返回值为int,不带参数的函数指针,
就是说funcptr 是 int (*)()型的指针
funcptr table[10];
定义一个数组,这个数组是funcptr类型的。就是说这个数组内的内容是一个指针,这个指针指向一个返回值为int,不带参数的函数 */
FUN func=&add2;
func();
结构体中包含函数指针
其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.
#include
struct DEMO
{
int x,y;
int (*func)(int,int); //函数指针
};
int add1(int x,int y)
{
return x*y;
}
int add2(int x,int y)
{
return x+y;
}
void main()
{
struct DEMO demo;
demo.func=add2; //结构体函数指针赋值
//demo.func=&add2; //结构体函数指针赋值
printf("func(3,4)=%d\n",demo.func(3,4));
demo.func=add1;
printf("func(3,4)=%d\n",demo.func(3,4));
}
执行后终端显示:
func(3,4)=7
func(3,4)=12
结构体中指向函数的指针
C语言中的struct是最接近类的概念,但是在C语言的struct中只有成员,不能有函数,但是可以有指向函数的指针,这也就方便了我们使用函数了。举个例子,如下:
#include
#include
#include
typedef struct student
{
int id;
char name[50];
void (*initial)();
void (*process)(int id, char *name);
void (*destroy)();
}stu;
void initial()
{
printf("initialization...\n");
}
void process(int id, char *name)
{
printf("process...\n%d\t%s\n",id, name);
}
void destroy()
{
printf("destroy...\n");
}
int main()
{
stu *stu1;
//在VC和TC下没有malloc也可以正常运行,但是linux gcc下就会出错,为段错误,必须使用malloc
stu1=(stu *)malloc(sizeof(stu));
//使用的时候必须要先初始化
stu1->id=1000;
strcpy(stu1->name,"C++");
stu1->initial=initial;
stu1->process=process;
stu1->destroy=destroy;
printf("%d\t%s\n",stu1->id,stu1->name);
stu1->initial();
stu1->process(stu1->id, stu1->name);
stu1->destroy();
free(stu1);
return 0;
}终端显示:1000 C++initialization...process...1000 C++destroy..
c语言中,如何在结构体中实现函数的功能?把结构体做成和类相似,让他的内部有属性,也有方法,
这样的结构体一般称为协议类,提供参考:
struct {
int funcid;
char *funcname;
int (*funcint)(); /* 函数指针 int 类型*/
void (*funcvoid)(); /* 函数指针 void类型*/
};
每次都需要初始化,比较麻烦
#include
typedef struct
{
int a;
void (*pshow)(int);
}TMP;
void func(TMP *tmp)
{
if(tmp->a >10)//如果a>10,则执行回调函数。
{
(tmp->pshow)(tmp->a);
}
}
void show(int a)
{
printf("a的值是%d\n",a);
}
void main()
{
TMP test;
test.a = 11;
test.pshow = show;
func(&test);
}
终端显示:a的值是11
/*一般回调函数的用法为:
甲方进行结构体的定义(成员中包括回调函数的指针)
乙方定义结构体变量,并向甲方注册,
甲方收集N个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。
当函数指针做为函数的参数,传递给一个被调用函数,
被调用函数就可以通过这个指针调用外部的函数,这就形成了回调
一般的程序中回调函数作用不是非常明显,可以不使用这种形式
最主要的用途就是当函数不处在同一个文件当中,比如动态库,要调用其他程序中的函数就只有采用回调的形式,通过函数指针参数将外部函数地址传入来实现调用
函数的代码作了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级
*/
结构体指针变量的定义
定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;…};struct 结构体标识符 *指针变量名;变量初始化:struct 结构体标识符 变量名={初始化值1,初始化值2,…,初始化值n };形式2:在定义类型的同时定义变量struct 结构体标识符{ 成员变量列表;…} *指针变量名;形式3:直接定义变量,用无名结构体直接定义变量只能一次struct{ 成员变量列表;…}*指针变量名;其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。函数指针的定义一般的函数指针可以这么定义: int (*func)(int,int);表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:int add2(int x,int y){ return x+y;}那么在实际使用指针func时可以这样实现:func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同printf("func(3,4)=%d\n",func(3,4));事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.typedef int (*FUN)(int,int); //参考下面
/* typedef int (*funcptr)(); 这个的意思是:定义一个返回值为int,不带参数的函数指针,
就是说funcptr 是 int (*)()型的指针
funcptr table[10];
定义一个数组,这个数组是funcptr类型的。就是说这个数组内的内容是一个指针,这个指针指向一个返回值为int,不带参数的函数 */
FUN func=&add2;
func();
结构体中包含函数指针
其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.
#include
struct DEMO
{
int x,y;
int (*func)(int,int); //函数指针
};
int add1(int x,int y)
{
return x*y;
}
int add2(int x,int y)
{
return x+y;
}
void main()
{
struct DEMO demo;
demo.func=add2; //结构体函数指针赋值
//demo.func=&add2; //结构体函数指针赋值
printf("func(3,4)=%d\n",demo.func(3,4));
demo.func=add1;
printf("func(3,4)=%d\n",demo.func(3,4));
}
执行后终端显示:
func(3,4)=7
func(3,4)=12
结构体中指向函数的指针
C语言中的struct是最接近类的概念,但是在C语言的struct中只有成员,不能有函数,但是可以有指向函数的指针,这也就方便了我们使用函数了。举个例子,如下:
#include
#include
#include
typedef struct student
{
int id;
char name[50];
void (*initial)();
void (*process)(int id, char *name);
void (*destroy)();
}stu;
void initial()
{
printf("initialization...\n");
}
void process(int id, char *name)
{
printf("process...\n%d\t%s\n",id, name);
}
void destroy()
{
printf("destroy...\n");
}
int main()
{
stu *stu1;
//在VC和TC下没有malloc也可以正常运行,但是linux gcc下就会出错,为段错误,必须使用malloc
stu1=(stu *)malloc(sizeof(stu));
//使用的时候必须要先初始化
stu1->id=1000;
strcpy(stu1->name,"C++");
stu1->initial=initial;
stu1->process=process;
stu1->destroy=destroy;
printf("%d\t%s\n",stu1->id,stu1->name);
stu1->initial();
stu1->process(stu1->id, stu1->name);
stu1->destroy();
free(stu1);
return 0;
}终端显示:1000 C++initialization...process...1000 C++destroy..
c语言中,如何在结构体中实现函数的功能?把结构体做成和类相似,让他的内部有属性,也有方法,
这样的结构体一般称为协议类,提供参考:
struct {
int funcid;
char *funcname;
int (*funcint)(); /* 函数指针 int 类型*/
void (*funcvoid)(); /* 函数指针 void类型*/
};
每次都需要初始化,比较麻烦
#include
typedef struct
{
int a;
void (*pshow)(int);
}TMP;
void func(TMP *tmp)
{
if(tmp->a >10)//如果a>10,则执行回调函数。
{
(tmp->pshow)(tmp->a);
}
}
void show(int a)
{
printf("a的值是%d\n",a);
}
void main()
{
TMP test;
test.a = 11;
test.pshow = show;
func(&test);
}
终端显示:a的值是11
/*一般回调函数的用法为:
甲方进行结构体的定义(成员中包括回调函数的指针)
乙方定义结构体变量,并向甲方注册,
甲方收集N个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。
当函数指针做为函数的参数,传递给一个被调用函数,
被调用函数就可以通过这个指针调用外部的函数,这就形成了回调
一般的程序中回调函数作用不是非常明显,可以不使用这种形式
最主要的用途就是当函数不处在同一个文件当中,比如动态库,要调用其他程序中的函数就只有采用回调的形式,通过函数指针参数将外部函数地址传入来实现调用
函数的代码作了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级
*/
来源:https://www.cnblogs.com/lvjunjie/p/8961731.html
c语言中结构体类型定义的函数指针,结构体中定义函数指针相关推荐
- Java中的byte类型是有符号的吗_JAVA中byte类型的介绍。 谢谢
展开全部 Java也提供62616964757a686964616fe59b9ee7ad9431333431366265了一个byte数据类型,并且是基本类型.java byte是做为最小的数字来处理 ...
- altium中错误报告类型_Python 官方团队在打包项目中踩过的坑
花下猫语:这是 packaging 系列的第三篇译文,该系列是全网关于此话题的最详尽(水平也很高)的一个系列.原作者是 Python 官方打包团队成员,是 virtualenv 和 tox 项目的维护 ...
- c语言汉字属于什么类型_空气悬浮风机在风机中属于什么类型?
鼓风机是以气体为介质,能将机械能传递给气体,提高气体的压力并抽吸或压送气体的机械称为风机. 空气悬浮鼓风机属于类型什么类型?可以按风机出口气体压力分类和按工作原理分类. 1. 按风机出口气体压力分类( ...
- MySQL中通配类型各自作用_在Access数据库中。在查找操作中,通配符*、?与#各有什么作用?...
展开全部 *通配任何bai多个数的字符,它可du以在字符串中当作第一zhi个或最后一个字dao符使用. ?通配任专意单属个字符. #通配任何单个数字字符. 如果正在查找以AEW开头的一个文件,但不记得 ...
- 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )
文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...
- C语言程序设计 使用结构体类型处理组合数据——用户自定义数据类型
1 定义和使用结构体变量 1.1 自定义建立结构体类型 好处:反映出成员之间的内在联系. 在程序中建立所需要结构体类型.例如: 指定了一个新的结构体类型struct student. struct是声 ...
- C语言基础 - 结构体类型字节对齐总结
一.什么是字节对齐 在计算机中,内存空间是按照字节(1B = 8 bit)划分的,每一个字节都有一个编号,这就是字节的地址.理论上可以从任意起始地址访问任意数据类型的变量,但在实际使用中,访问特定数据 ...
- c语言结构体定义和使用typedef,结构体定义typedef struct 用法详解
typedef是类型定义的意思,typedef struct是为了使用这个结构体方便. 在了解typedef之前我们先来了解一下什么是结构体类型: C++提供了许多种基本的数据类型(如int.floa ...
- C语言:关键字---struct(声明结构体类型)
C语言32个关键字 有32个关键字详细说明,还有跳转链接! 一.struct-简介 struct就是结构体,用来描述需要相同类型或不同类型数据的数据对象. 通俗的说法就是打包封装,将一些分散的数据整合 ...
最新文章
- 越心虚越藏着掖着,越藏越掖越脱节
- 线程和进程有什么区别
- python note 11 函数名的使用、闭包、迭代器
- PAT甲级1061 Dating:[C++题解]字符串处理(C语言格式控制牛逼!)
- 服务器负载不高 响应慢_京东面试官问我什么是负载均衡,兄弟们我这样说对嘛?...
- 我用过 | Keil的发展历史
- Java消息服务~@JmsListener集成
- 干货 | PyTorch常用代码段整理合集
- 【linux】【git】git报错fatal: HTTP request failed
- 最长上升子序列(LIS)和最长公共子序列(LCS) 模板
- 七月算法机器学习3 矩阵分析与应用
- Android如何计算时间差
- 北京大学计算机系 丁主任,北大“扫地僧”韦东奕,真的是正常人吗?北大丁教授说出了答案...
- 浏览器刷新vue为什么不会走beforeDestroy和destroyed生命周期
- 回归平静是一种自我保护
- :hover放前面和放后面的区别
- OO ALV中的data_changed、data_changed_finished事件介绍
- 微信小程序—在原有数组内添加元素
- win7喇叭红叉耳机扬声器已拔出驱动无法修复
- 给网站开发者推荐18个在线手册,值得收藏