结构体指针变量的定义

定义结构体变量的一般形式如下:形式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语言中结构体类型定义的函数指针,结构体中定义函数指针相关推荐

  1. Java中的byte类型是有符号的吗_JAVA中byte类型的介绍。 谢谢

    展开全部 Java也提供62616964757a686964616fe59b9ee7ad9431333431366265了一个byte数据类型,并且是基本类型.java byte是做为最小的数字来处理 ...

  2. altium中错误报告类型_Python 官方团队在打包项目中踩过的坑

    花下猫语:这是 packaging 系列的第三篇译文,该系列是全网关于此话题的最详尽(水平也很高)的一个系列.原作者是 Python 官方打包团队成员,是 virtualenv 和 tox 项目的维护 ...

  3. c语言汉字属于什么类型_空气悬浮风机在风机中属于什么类型?

    鼓风机是以气体为介质,能将机械能传递给气体,提高气体的压力并抽吸或压送气体的机械称为风机. 空气悬浮鼓风机属于类型什么类型?可以按风机出口气体压力分类和按工作原理分类. 1. 按风机出口气体压力分类( ...

  4. MySQL中通配类型各自作用_在Access数据库中。在查找操作中,通配符*、?与#各有什么作用?...

    展开全部 *通配任何bai多个数的字符,它可du以在字符串中当作第一zhi个或最后一个字dao符使用. ?通配任专意单属个字符. #通配任何单个数字字符. 如果正在查找以AEW开头的一个文件,但不记得 ...

  5. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  6. C语言程序设计 使用结构体类型处理组合数据——用户自定义数据类型

    1 定义和使用结构体变量 1.1 自定义建立结构体类型 好处:反映出成员之间的内在联系. 在程序中建立所需要结构体类型.例如: 指定了一个新的结构体类型struct student. struct是声 ...

  7. C语言基础 - 结构体类型字节对齐总结

    一.什么是字节对齐 在计算机中,内存空间是按照字节(1B = 8 bit)划分的,每一个字节都有一个编号,这就是字节的地址.理论上可以从任意起始地址访问任意数据类型的变量,但在实际使用中,访问特定数据 ...

  8. c语言结构体定义和使用typedef,结构体定义typedef struct 用法详解

    typedef是类型定义的意思,typedef struct是为了使用这个结构体方便. 在了解typedef之前我们先来了解一下什么是结构体类型: C++提供了许多种基本的数据类型(如int.floa ...

  9. C语言:关键字---struct(声明结构体类型)

    C语言32个关键字 有32个关键字详细说明,还有跳转链接! 一.struct-简介 struct就是结构体,用来描述需要相同类型或不同类型数据的数据对象. 通俗的说法就是打包封装,将一些分散的数据整合 ...

最新文章

  1. 越心虚越藏着掖着,越藏越掖越脱节
  2. 线程和进程有什么区别
  3. python note 11 函数名的使用、闭包、迭代器
  4. PAT甲级1061 Dating:[C++题解]字符串处理(C语言格式控制牛逼!)
  5. 服务器负载不高 响应慢_京东面试官问我什么是负载均衡,兄弟们我这样说对嘛?...
  6. 我用过 | Keil的发展历史
  7. Java消息服务~@JmsListener集成
  8. 干货 | PyTorch常用代码段整理合集
  9. 【linux】【git】git报错fatal: HTTP request failed
  10. 最长上升子序列(LIS)和最长公共子序列(LCS) 模板
  11. 七月算法机器学习3 矩阵分析与应用
  12. Android如何计算时间差
  13. 北京大学计算机系 丁主任,北大“扫地僧”韦东奕,真的是正常人吗?北大丁教授说出了答案...
  14. 浏览器刷新vue为什么不会走beforeDestroy和destroyed生命周期
  15. 回归平静是一种自我保护
  16. :hover放前面和放后面的区别
  17. OO ALV中的data_changed、data_changed_finished事件介绍
  18. 微信小程序—在原有数组内添加元素
  19. win7喇叭红叉耳机扬声器已拔出驱动无法修复
  20. 给网站开发者推荐18个在线手册,值得收藏

热门文章

  1. python离散数据傅里叶变换公式_离散傅里叶变换笔记
  2. 借呗被突然关闭了,是什么原因?怎么办?
  3. ant design vue 点击事件
  4. 将一个很长(>30)的十进制数转换为二进制数
  5. python基础之while循环基本使用
  6. 如何成为一名全职创作者——程序员篇
  7. 【计算机毕业设计】079网上商城设计
  8. jest测试具体方法
  9. java画球_canvas绘制3d球体
  10. Kurento实战之六:云端录制