结构体通过指针调用函数的方法在项目中比较实用:上层函数实现,底层调用从而实现底层通知上层的回调功能!!!
在此说一下函数指针和指针函数这两个概念,下面先说一下两者的区别。
再者就是说一下结构体是如何通过函数指针的方式调用函数的。
//------------------------------------------------------------------------------------------------------------//
struct DEMO
{
int x,y;
int (*func)(int,int); //函数指针
};
int add2(int x,int y)
{
return x+y;
}
void main()
{
struct DEMO demo;
demo.func=&add2; //结构体函数指针赋值
//demo.func=add2;//这样写也可以?!通过TC验证&add2和add2打印结果相同。
printf("func(3,4)=%d\n",demo.func(3,4));
1、指针函数
指针函数本质是一个函数,函数返回类型是某一类型的指针。
定义格式 :函数类型 * 函数名( 参数列表)
例: int * func1 (x, y ) 返回值为 整型类型指针的函数
char * func2 (x, y ) 返回值为 字符类型指针的函数
这里 func1(x, y ) 和func2(x,y)都是函数。调用时直接写func1(),不用加 *,而且不能把一个指针赋给此函数func1或func2;
例如:
#include "stdio.h"
char *func(char *str1,char *str2)
{
int i;char *p;p=str2
if(*str2==NULL) exit(-1);do{
*str2=*str1;
str1++;
str2++;
}while(*str1!=NULL);
return(p);
}
main()
{ char str1[]="hello world!";
char str2[]="Welcom to study C!";
printf("%s",func(str1,str2)); //func(str1,str2))是指针
}
2、函数指针
函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少。
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
例 int F();//声明一个函数;
int (*P)() ;// 声明函数指针
main()
{ P=F;
(*P)();//调用函数
}
3、易混淆之处
int *(*func) ( x,y); //第一个星花*表示此函数是个返回值为整型指针的函数,第二个星花*表示func为函数指针。
函数调用的方法: (*func)(x,y);
4、结构体调用函数的方法
调用方法 :结构体增加函数指针为成员变量
例:
typedef struct student
{
int xPosition;
int yPosition;
void ( *fun ) (x ,y );
} stu; //定义一个结构体
MyFunc(); //声明并定义一个函数
... ...
stu Xiaoming[1]={ 0,0, MyFunc }; //实现一个结构体
func=MyFunc; // 给结构体的函数指针赋值
Xiaoming.func(x, y); //调用结构体中的函数
注意结构体调用函数时,和一般调用函数指针时不一样,这里不需要加那个星花 *
一般调用带函数指针的函数的方法是:(* func)(x, y);