函数指针
定义:指向函数的指针,用来存放函数的地址
这里我们举一个小例子
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int *pa = &a;//pa就是整型指针
char arr[5] = { 0 };
char(*parr)[5] = &arr;//parr就是数组指针
printf("%p\n", &Add);
int(*pf)(int,int) = &Add;//pf就是函数指针
return 0;
}
练习题
用函数指针模拟实现strlen函数
#include<stdio.h>
#include<assert.h>
int my_strlen(const char *str)
{
assert(str!=NULL);
int count = 0;
while (*str)
{
*str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int(*pf)(const char*) = my_strlen;
int len = (*pf)("bit");
printf("%d", len);
return 0;
}
接下来思考一个题
(*(void(*)())0)();
大家先看里面,void(*)()是一个函数指针类型,0是一个整型数字,这里含义是将0强制转换为函数指针类型再解引用。整个题目的意思是,调用0地址处的函数,该函数无参数,返回类型的void。(如果可以独立思考出这个题基本上函数指针的理解就没有问题了)
再来看下面这一个问题
void(signal(int, void()(int)))(int);
这是一个函数声明,声明的函数叫signal,signal函数有两个参数,第一个参数类型是int,第二个参数类型是一个函数指针,该函数指针指向的函数参数是Int,返回类型的void。
signal函数的返回类型是一个函数指针,该函数指针指向的函数参数是Int,返回类型是void。
可是,这样写可读性太差了
由此我们需要起一个别名,简化一下
typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);
函数指针数组
定义:存放函数指针的数组
eg:int (*p[2])(int,int)={Add,Sub};
简化加减乘除的算法
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 input = 0;
int x = 0;
int y = 0;
int ret = 0;
int (*pfArr[])(int,int) = { 0, Add, sub, mul, div };
do
{
if (0 == input)
{
printf("退出程序");
break;
}
else if (input>=1&&input<=4)
{
scanf("%d", &input);
printf("请输入两个操作数");
scanf("%d %d", &x, &y);
ret = pfArr[input](x, y);
printf("ret=%d\n", ret);
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}