结构体中定义函数指针
結(jié)構(gòu)體指針變量的定義,定義結(jié)構(gòu)體變量的一般形式如下:
形式1:先定義結(jié)構(gòu)體類型,再定義變量
struct結(jié)構(gòu)體標(biāo)識符
{
成員變量列表;…
};
struct 結(jié)構(gòu)體標(biāo)識符 *指針變量名;
變量初始化一:struct結(jié)構(gòu)體標(biāo)識符 變量名={初始化值1,初始化值2,…, 初始化值n };
形式2:在定義類型的同時定義變量
struct結(jié)構(gòu)體標(biāo)識符
{
成員變量列表;…
} *指針變量名;
變量初始化二:
形式3:直接定義變量,用無名結(jié)構(gòu)體直接定義變量只能一次
struct
?{
成員變量列表;…
}*指針變量名;
其中“指針變量名”為結(jié)構(gòu)體指針變量的名稱。形式1是先定義結(jié)構(gòu)體,然后再定義此類型的結(jié)構(gòu)體指針變量;形式2和形式3是在定義結(jié)構(gòu)體的同時定義此類型的結(jié)構(gòu)體指針變量。
函數(shù)指針的定義
一般的函數(shù)指針可以這么定義:
int(*func)(int,int);
表示一個指向含有兩個int參數(shù)并且返回值是int形式的任何一個函數(shù)指針. 假如存在這樣的一個函數(shù):
int add2(int x,int y)
{
return x+y;
}
那么在實際使用指針func時可以這樣實現(xiàn):
func=&add2; //指針賦值,或者func=add2; add2與&add2意義相同
printf("func(3,4)=%d\n",func(3,4));
事實上,為了代碼的移植考慮,一般使用typedef定義函數(shù)指針類型.
typedef int(*FUN)(int,int);
FUN func=&add2;
func();
結(jié)構(gòu)體中包含函數(shù)指針
其實在結(jié)構(gòu)體中,也可以像一般變量一樣,包含函數(shù)指針變量.下面是一種簡單的實現(xiàn).
#include <stdio.h>
struct DEMO
{
int x,y;
int (*func)(int,int); //函數(shù)指針
};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; //結(jié)構(gòu)體函數(shù)指針賦值
//demo.func=&add2; //結(jié)構(gòu)體函數(shù)指針賦值
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
*/
結(jié)構(gòu)體中指向函數(shù)的指針??????????????????????????????????????????
C語言中的struct是最接近類的概念,但是在C語言的struct中只有成員,不能有函數(shù),但是可以有指向函數(shù)的指針,這也就方便了我們使用函數(shù)了。舉個例子,如下:#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下就會出錯,為段錯誤,必須mallocstu1=(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語言中,如何在結(jié)構(gòu)體中實現(xiàn)函數(shù)的功能?把結(jié)構(gòu)體做成和類相似,讓他的內(nèi)部有屬性,也有方法
這樣的結(jié)構(gòu)體一般稱為協(xié)議類,提供參考:?
struct {?
?int funcid;?
?char *funcname;?
?int (*funcint)(); /* 函數(shù)指針 int 類型*/?
?void (*funcvoid)(); /* 函數(shù)指針 void類型*/?
};?
每次都需要初始化,比較麻煩
?
#include <stdio.h>typedef struct
{
int a;
void (*pshow)(int);
}TMP;void func(TMP *tmp)
{if(tmp->a >10)//如果a>10,則執(zhí)行回調(diào)函數(shù)。{(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);
}/*
一般回調(diào)函數(shù)的用法為:
甲方進行結(jié)構(gòu)體的定義(成員中包括回調(diào)函數(shù)的指針)乙方定義結(jié)構(gòu)體變量,并向甲方注冊,
甲方收集N個乙方的注冊形成結(jié)構(gòu)體鏈表,在某個特定時刻遍歷鏈表,進行回調(diào)。
當(dāng) 函數(shù)指針 做為函數(shù)的參數(shù),傳遞給一個被調(diào)用函數(shù),
被調(diào)用函數(shù)就可以通過這個指針調(diào)用外部的函數(shù),這就形成了回調(diào)一般的程序中回調(diào)函數(shù)作用不是非常明顯,可以不使用這種形式
最主要的用途就是當(dāng)函數(shù)不處在同一個文件當(dāng)中,比如動態(tài)庫,要調(diào)用其他程序中的函數(shù)就只有采用回調(diào)的形式
通過函數(shù)指針參數(shù)將外部函數(shù)地址傳入來實現(xiàn)調(diào)用
函數(shù)的代碼作了修改,也不必改動庫的代碼,就可以正常實現(xiàn)調(diào)用便于程序的維護和升級
*/
?
參考:
C結(jié)構(gòu)體中的函數(shù)指針與函數(shù)
函數(shù)指針模擬多態(tài)
總結(jié)
以上是生活随笔為你收集整理的结构体中定义函数指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双链表的实现
- 下一篇: GCC编译选项--创建与使用库