1.函数指针变量
🌏函数指针变量:⽤来存放函数地址的,未来通过地址能够调⽤函数的。
🌏函数名就是函数的地址,也可以通过&函数名作为函数地址
🌙函数指针变量的写法其实和数组指针⾮常类似。
例如:
数组指针:int (*p1)[10]
函数指针:int (*p2)(int x,int y)
🌈函数指针解析:
int:p2指向函数的返回类型
(*p2):函数指针变量名
(int x,int y):p2指向函数的返回类型
int (*)(int x,int y):p2函数指针变量的类型
2.使用函数指针变量
通过函数指针调用指针指向的函数
//函数指针
int Add(int x, int y)
{
return x + y;
}
int main()
{
int(*p3)(int, int) = Add;
printf("%d\n", (*p3)(2,3));
printf("%d\n",p3(8,1));
return 0;
}
🌏(*p3)(2,3)和p3(8,1)相当于Add(2,3)和Add(8,1)
看出调用函数时的 * 可以省略
🌙我们来看两段来自《C陷阱和缺陷》的代码
1.(* ( void ( * ) ( ) ) 0 )( )
2.void ( * signal ( int , void( * )( int ) ) )( int )
3.typedef 关键字
🌏typedef:⽤来数据类型重命名的,可以将复杂的类型,简单化。(❗不是弄混成变量名)
例如:
将 unsigned int 重命名成 unit
typedef unsigned int unit;
将 int* 重命名成ptr_t
typedef int* ptr_r;
将 int(*)[5] 重命名成parr_t
typedef int(*parr_t)[5];//新类型名必须在*右边
将 void(*)int 重命名pf_t
typedef void(*pf_t)(int);//新类型名必须在*右边
所以void ( * signal ( int , void( * )( int ) ) )( int )可以
重命名成 pf_t signal(int,pf_t);
4.函数指针数组
🌏函数指针数组:存放的是函数指针的数组
定义:
//pa先和[]结合,说明pa是数组,数组内容是int (*)()类型的指针
int (*pa[3])();
5.函数指针数组的用途:转移表
#include<stdio.h>
void menu()
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf(" 0:exit \n");
printf("*************************\n");
}
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
int main()
{
int x = 0;
int y = 0;
int input = 1;
int ret = 0;
//转移表,函数指针数组实现
int(*p[5])(int x,int y) = {0,add,sub,mul,div};
do
{
menu();//调用菜单函数
printf("请选择:>");
scanf("%d",&input);
if ((input <= 4 && input >= 1))
{
printf("请输入操作数:>");
scanf("%d %d",&x,&y);
ret = (*p[input])(x, y);
printf("ret=%d\n",ret);
}
else if (input == 0)
{
printf("退出计算器\n");
}
else
{
printf("输入有误,重新输入\n");
}
} while (input);
return 0;
}
感谢阅读,若有不足,望指正。