结构体中的函数指针
C语言真是很灵活,今天发现结构中函数指针的应用,就查了些资料总结一下。其实在结构体已经和C++中的类功能差不多,只是其是面向过程,没有了作用域的要求,如public等你可以在结构体中定义函数函数指针,然后对其调用和类调用方法一样,在调用时对其赋值(你要调用的指针),这样看来,C也可以临时客串一下面向对象了。呵呵.大家可以试一下.
1 #include<stdio.h>
2 struct square
3 {
4 int length;
5 int width;
6 int height;
7 int (*add)(int a,int b);
8 };
9 int square_add(int a,int b)
10 {
11 return a + b;
12 }
13 int bulk(int length,int width,int height)
14 {
15 struct square squ =
16 {
17 .length = length,
18 .width = width,
19 .height = height,
20 add:square_add,
21 };
22
23 printf("Add() is %d\n",squ.add(100,200));
24 printf("Length is %d\n",squ.length);
25 printf("Width is %d\n",squ.width);
26 printf("Height is %d\n",squ.height);
27 return squ.length * squ.width * squ.height;
28 }
29 int main()
30 {
31 printf("The square is %d\n",bulk(100,200,300));
32 return 0;
33 }
C语言中的struct是最接近类的概念,但是在C语言的struct中只有成员,不能有函数,但是可以有指向函数的指针,这也就方便了我们使用函数了。举个例子,如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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,"xufeng");
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;
}
------------------------------------
c语言中,如何在结构体中实现函数的功能?把结构体做成和类相似,让他的内部有属性,也有方法
这样的结构体一般称为协议类,提供参考:
struct {
int funcid;
char *funcname;
int (*funcint)(); /* 函数指针 int 类型*/
void (*funcvoid)(); /* 函数指针 void类型*/
};
每次都需要初始化,比较麻烦