关于在 C 语言结构体中使用函数指针的问题

所需积分/C币:43 2016-03-16 09:20:05 245KB PDF
收藏 收藏
举报

结构体是 C 语言中一个非常重要的自定义数据类型,它描述了一系列相同类型或不同类型数据构成的数据集合。但是在 C 语言的结构体成员却不能是函数,针对这一问题,本文分析探讨了将函数指针作为结构体成员的理论和方法。通过在结构体中定义函数指针类型的成员,从而实现了在结构体中使用函数的目的。
1 filename: struct-foopointc 2 #include <stdio. h> 3 struct DEMO int x, y 6 (*pf)(int,int);/函数指针 9//函数原型,注意都是int((nt,inty)类型的函数 Lo int multi(int x, int y) 11 int add (int x, int y) 13 int maino 14 struct demo demo 6 demo.pf=aad;/结构体函数指针赋值 printf("pf(3, 4)=%d\n", demo pf(3, 4)): 8 demo. pf multi printf("pf(3, 4)=%d\n", demo pf(3, 4)); return o 25 int multi(int x, int y) return x y; 30 int add (int x, int y) return x y; 当然,为了便于代码的移植可以使用 typedef为函数类型的指针类型定义一个别名来使用函数指 针,如 1//filename: struct-foopoint-typedefc include <stdio. h> 3 #include <stdlib.h> #include <string. h> 6/为函数类型定义别名 7 typedef void (k noParaFun)O 8 typedef void ( twoParaFun)(int, char *) 声明结构体 11 typedef struct student 12 int id 11 ame leo] 15 noParaFun pfInital; twoParaFun pfprocess; 17 ParaFun pfDest f stu: ∥函数原型 21 void Initial 22 void Process (int id, char *name 23 void Destroy o) int main o 26 tu *stu1 tu1=( oC(SIze 30 初始亿结构体 stu1->id=1000; strcpy(stul->name,"C++) 为函数指针赋值 stu1->pfInital = Initia stul->pfProcess Process tul->p 39 printf("%d\t%s\n", stu1->id, stu1->name); 通过函数指针调用函数 stul->pfInitalO stul->pfProcess(stu1->id, stu1->name) stul->pfDestroy (: u1) return o 50 51 void Initial 2 rintf( "initialization.\n") 4 54 56 void Process (int id, char *name 58 printf("process.\n%d\tysn", id, name) 60 61 void Destroy O { printf("destroy. \n"); } 在结构体中使用的函数指针指向的函数的形参叮以是其它的变量,如 // filename: funp tThisfArgc 2 include <stdio. h> 3 #include <stdlib. h> 5/为函数类型定义别名 G typedef struct aritmathic* art 7 typedef int ( fooType)(arPt); 9/声明结构体 struct aritmathic int ai int b fooType subtract; fooType multiply 7} 9函数原型 int Add(struct aritmathic* ar) int Subtract(struct aritmathic* ar) 22 int Multiply (struct aritmathic* ar); 24 int main o struct aritmathic ar: ar add Add ar subtract Subtract armultiply Multiply; int a ar add (Sar) int b= ar subtract(&ar) 37 int c=ar multiply(&ar); 39 printf("%d\n%d\n%d",a,b, c); return 0: 13//加法 int Add(struct aritmathic* ar return (ar->a+ ar->b); A8//减法 49 int Subtract(struct aritmathic* ar) return (ar->a- ar->b) ∥乘法 64 int Multiply(struct aritmathicx ar) return (ar->a ar->b); 也可以是自己结构体类型的形参,如 / filename: funptGenA include <stdio. h> 3 include <stdlib.h> 5为函数类型定义别名 6 typedef int ( fooType)(int, int); 8/声明结构体 9 struct aritmathic ant a t b fooType add fooT foo Type multiply; 18/函数原型 ly int Add (int a, int b) 20 int Subtract(int a, int b) int Multiply (int a, int b); s int maino 定义结构体类型的变量 struct aritmathic ar 结构体数据成员赋值 a=4 结构体函数指针赋值 ar add Add ar, subtract subtract ar multiply multipl 通过函数指针调用函数,操作结构数据成员 int a= ar. add(ara, arb) int b= ar subtract (ar a, ar b) int c= armultiply(ara, arb); 40 ∥输出结果 printf("%d\n%d \n%d", a,b,c); return 02 47 int Add (int a, int b) 49 return (a+ b) ∥减法 53 int Subtract (int a, int b) turn(a-b) 58乘法 int Multiply (int a, int b) return (a b) 利用函数指针也可以将对结构体中数据成员的操作进行封裝,让用户通过函数操作数据成员,避 免直接操作数据成员。同时,利用自己结构体类型的形参还可以实现C++中this指针的模拟,如: filename: thisPointerc 2 #include <stdio. h> /类型命名 5 typedef struct date The Class; 7∥/定义结构体类型 8 struct date 函数指针成员 int (*get)(TheClass* this) 12 void (*set)(TheClass* this, int i) 数据成员 int member, 17 18//函数声明 int Get(The Class* this) o void Set(TheClass* this, int 1) 21 void init(TheClass* this) 3测试 24 int main(int argc, char *wargv) 26 定义结构体变量 TheClass name ∥初始亿结构体变量 init(&name) ∥调用set函数 (name set)(&name, 10) 调用get函数 printf("%d\n",(name. get)(&name)) return o 9/初始化函数(为函数指针赋值) void init(TheClass* this) this-get=acet;∥/也可以是thas->get=Cet this->set=kSet;∥/也可以是this->set=Set; 44 46//Get函数 47 int Get(TheClass* this) The class* This this 50 return This->member; 51 53//set函数 4 void Set(TheClass* this, int i) 55 Theclass k This this 57 This->member =i 利用在结构体中集成函数指针,还可以实现结构体类型的变量与其它类型变量的比较操作,如: I //filename: cmpThisIntc 2# nclude<sta讠o.b> 3 #include <stdlib. h> 5结构体定义 struct int struc int data 函数指针 int (*compare_func)(const int, const int) 3/声明函数原型 14/实现结构体变量与整型数据比较的函数 15 int cmp_to- data(struct int_struct* m, int comparable); 16/创建结构体变量(注意函数指针作为形参 17 struct int_struct* create_struct(int initial_data, int (*compare_ func)(int, int)) 18比较两个整型数的函数 19 intint_compare(const int a, const int b) ∥测试 22 int main(int argc, const chark argv d) 〃构造一个整型结构体 int int data 42 /用一个整型数和比较两个整型数的函数为实参 struct int_struct* int_comparator = create_ struct(int_data, int_compare) /结构体变量与整变量比较 int int comparable 42 if (cmp_to_data (int_comparator, int_comparable 33 printf("The two ints are equal. \n"); 释放内存 37 free(int_comparator) return o 41 42∥/实现结构体变量与整型数据比较的函数 int cmp_to_data(struct int_struct* m, int comparable return m->compare_ func(m->data, comparable) 48∥/创建结构体变量(注意函数指针作为形参) struct int struct* create struct(int initial data, int (*compare func)(int, int)) /分配内存空间 struct int struct* result malloc((sizeof(struct int struct))); ∥给数据成员赋值 55 result->data initial data; 结函数指针赋值 57 result->compare func compare func 58 return result 9 61/比较两个整型数的函数 int int compare (const int a, const int b) return a 在C语言中,在结构体中使用函数指针将属性和方法统一进行封装,这样的结构体一般称为协 议类,是C语言中一种常用的编程技术 另外,也常用带有函数指针的结构体实现程序设计中的回调函数机制。一般的程序中回调函数作 用不是非常明显,可以不使用这种形式。回调函数机制最主要的用途就是当函数处于不同文件(比如 动态库等),要调用其他程序巾的函数就只有采用回调的形式通过将外部函数的地址通过函数指针 形参传入函数来实现调用,便于程序的维护和升级。关于回调函数机制的原理和详情,请大家查阋相 关资料

...展开详情
试读 11P 关于在 C 语言结构体中使用函数指针的问题
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
kobezhan 挺有用的,谢谢
2017-05-23
回复
关注 私信 TA的资源
上传资源赚积分,得勋章
最新推荐
关于在 C 语言结构体中使用函数指针的问题 43积分/C币 立即下载
1/11
关于在 C 语言结构体中使用函数指针的问题第1页
关于在 C 语言结构体中使用函数指针的问题第2页
关于在 C 语言结构体中使用函数指针的问题第3页

试读结束, 可继续读1页

43积分/C币 立即下载 >