函数指针的定义与使⽤函数的本质
函数的本质是⼀段可执⾏性代码段。函数名,则是指向这段代码段的⾸地址。
#include <stdio.h>
void print()
{
printf("china\n");
}
void dis()
{
printf("china\n");
}
int main()
{
void (*pf)() = print; //void (*pf)() = &print; //此两种形式的的赋值⽅式都是没有问题的。
pf(); //(*pf)();
pf = dis;
pf();
return0;
}
1)上述代码中函数void print()和void dis()他们都有⼀个公共的类型就是void (*)(void);
2)使⽤void (*)(void)类型定义了⼀个变量名为p的函数指针,并且对其赋值;
更简洁的表⽰⽅式
当函数类型较为复杂时,我们往往使⽤typedef来定义⼀个简洁的类型名称使之更容易使⽤。
例如:typedef void (*PFUNC)();这时候我们就可以这样去使⽤:
typedef void (*PFUNC)() ;
int main()
{
PFUNC pf= print;
pf();
pf = dis;
pf();
return0;
}
应⽤场景
函数指针的⼀个⽤法出现在菜单驱动系统中。例如程序可以提⽰⽤户输⼊⼀个整数
值来选择菜单中的⼀个选项。⽤户的选择可以做函数指针数组的下标,⽽数组中的
指针可以⽤来调⽤函数。
#include <stdio.h>
void function0(int);
void function1(int);
void function2(int);
int main()
{
void (*f[3])(int) = {function0,function1,function2};
/
/将这 3 个函数指针保存在数组 f 中
int choice;
printf("Enter a number between 0 and 2, 3 to end: ");
scanf("%d",&choice);
while ((choice >= 0) && (choice <3))
{
(f[choice])(choice);//(*f[choice])(choice);这种写法亦可
//f[choice]选择在数组中位置为 choice 的指针。
//指针被解除引⽤,以调⽤函数,并且 choice 作为实参传递给这个函数。
printf("Enter a number between 0 and 2,3 to end: ");
scanf("%d",&choice);
指针函数的作用}
printf("Program execution completed.");
return0;
}
void function0(int a)
{
printf("You entered %d so function0 was called\n",a);
}
void function1(int b)
{
printf("You entered %d so function1 was called\n",b);
}
void function2(int c)
{
printf("You entered %d so function2 was called\n",c);
}
回调函数
#include <stdio.h>
int callBackCompare(int a,int b)
{
return a<b?1:0;
}
void selectSort(int *p, int n,int(*pf)(int,int))
{
for(int i=0; i<n-1 ;i ++)
{
for(int j=i+1; j<n; j++)
{
if(pf(p[i],p[j]))
{
p[i] = p[i]^p[j];
p[j] = p[i]^p[j];
p[i] = p[i]^p[j];
}
}
}
}
int main(void)
{
int arr[10] = {6,5,4,3,2,1,7,8,9,0};
selectSort(arr,10,callBackCompare);
for(int i=0; i<10; i++)
{
printf("%d\n",arr[i]);
}
return0;
}
回调函数本质
回调函数,本质也是⼀种函数调⽤,先将函数以指针的⽅式传⼊,然后,调⽤。这种写法的好处是,对外提供函数类型,⽽不是函数定义。这样我们只需要依据函数类型
和函数功能提供函数就可以了。给程序的书写带来了很⼤的⾃由。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。