概念
-
函数指针变量,就是用来保存函数地址的变量
-
函数名相当于这个函数的首地址
int func(int a, int b);
// 函数指针,指向的函数类型为返回值为int 参数为(int,int)的函数
int (*pfunc)(int a, int b);
指针函数:
int* func(int a,int b);
普通函数就是int func(int a,int b);
,返回值是int
,而指针函数就是返回值是指针的函数,即返回值是int*
。
函数指针:int (*func)(int x,int y);
这里定义了一个函数指针,只不过这个指针的格式有点特殊,正常定义的指针是把指针变量放到最后的,即int* p ;,p是指针变量,但是函数指针是把指针变量放到了中间,即func是指针变量,而且这是一个指向函数的指针变量,而具体指向哪个函数是自己定的。
#include <stdio.h>
typedef int int32_t;
// 给函数指针该别名,方便使用,增加指针的易用性
// 此时fptr就相当于void (*fptr)(int *a, int *b)的类型
typedef void (*fptr)(int *a, int *b);// 类似于 int类型 int a = 10
typedef int (*fMaxPtr)(int,int);// 函数指针的参数可以只写变量类型
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int max(int a, int b)
{
return a > b ? a : b;
}
int main(int argc, char const *argv[])
{
int a = 10 , b = 20;
// 定义函数指针指向swap
// 注意pfunc指针的类型与所指向的函数类型一致
// 将函数名去掉,剩下的部分为函数的类型
void (*pfunc)(int *a, int *b) = swap;
printf("%p\n",swap);
printf("%p\n",pfunc);
// 2. 将函数指针改别名
fptr p = swap;
printf("%p\n",p);
// 通过函数指针执行swap函数
//p(&a,&b);
pfunc(&a,&b);
printf("%d,%d\n",a,b);
// 定义函数指针指向max函数,实现比较最大值
fMaxPtr fmax = max;
printf("max = %d\n",fmax(19,29));
return 0;
}
函数指针数组
// 函数指针数组,数组存放的是指向返回值为 int 参数为int int类型的函数地址
int (*pfbuf[]) (int,int);
#include <stdio.h>
#include <string.h>
// 设计函数指针数组类型,增加易用性
typedef int (*fpbuf[2]) (int,int);
int Max(int a, int b)
{
return a > b ? a : b;
}
int Min(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char const *argv[])
{
// 定义函数指针数组
int (*pbuf[2]) (int,int) = {Max,Min};
// 输出最小值
printf("min = %d\n",pbuf[1](10,20));
fpbuf fbuf = {Max,Min};
// 输出最小值
printf("Max = %d\n",fbuf[0](10,20));
return 0;
}