一、简介
函数指针本质是一个指针,指向函数(首地址)的指针变量
指针函数本质是一个函数,只是这个函数返回的是一个指针。
如何来判断是函数指针还是指针函数呢????
最简单的方法就是通过看函数名前面的“*” 是不是别() 括进去了,如果是进去了,就是函数指针,反之则是指针函数
int * func(int a,int b); 这个就是指针函数
二、函数指针
这个指针执行的是一个函数,我们可以用这个指针来调用这个函数
声明格式:类型说明符 (*函数名)(参数)
// 定义一个很简单的函数指针
typedef int (*Calc)(int a, int b);
直接调用:直接通过函数名来调用
简接调用:通过函数指针来调用
有两个方法:
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
直接调用:
int x = 200;
int y = 2;
int z = 0;
z = add(x,y); // 直接调用
printf("%d+%d=%d\n", x, y, z);
简接调用: a 先声明一个指针函数
// 定义一个很简单的函数指针
typedef int (*Calc)(int a, int b);
调用:
// 简接调用
Calc func1 = &add;
Calc func2 = ⊂
z = func1(x, y);
printf("%d+%d=%d\n",x,y,z);
z = func2(x, y);
printf("%d+%d=%d\n", x, y, z);
void (*fptr)();
把函数的地址赋值给函数指针,可以采用下面两种形式:
fptr=&Function;
fptr=Function;
取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:
x=(*fptr)();
x=fptr();
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:
void (*funcp)();
void FileFunc(), EditFunc();
int main()
{
funcp = FileFunc;
(*funcp)();
funcp = EditFunc;
(*funcp)();
}
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
这个是一个最简单的函数指针,
三、指针函数
是一个带指针的函数,本质是一个函数,返回的是一个指针类型,指针函数一定是返回值的 ;
类型标志符 * 函数名(参数列表);int * func(int a );
int* func(int a ,int b); // 声明一个指针函数 int* func(int a ,int b) // 指针函数的实现 { int* p = (int*)malloc(sizeof(int)); printf("指针函数中的 p =0x%x \n",p); memset(p,0,sizeof(int)); *p = a * b; printf("*p=%d\n",*p); return p; //返回这个指针 } int main() { int* p1 = NULL; p1 = func(2,3); printf("main p1= 0x%x \n", p1); // 打印地值 printf(" main *p1=%d\n", *p1); return 0; } #endif
float * func2(int a ); float * p; p=func2(19);