目录
一、函数指针
二、函数指针数组
三、指向函数指针数组的指针
四、回调函数
一、函数指针
函数指针和我们前面学习的数组指针非常相似,函数名与&函数名的地址是一样的,说明函数名就是函数的地址。
从上面可以看出输出的是两个地址,这两个地址是 test 函数的地址。
函数指针有三部分组成:类型、指针、形参。类型和形参都允许为空,当我们想要调用函数时,只需要通过指针,并传入参数,就能正常使用函数。
上面我运用了函数指针的方法写了一个简单的加法函数。
下面的两段代码非常有趣,大家尝试的做一做,里面附有解析
二、函数指针数组
什么是函数指针数组呢? 在前面我们已经学过指针数组的概念了,其实本质上是一个数组,用来存放指针的数组,在这里我们可以得到函数的地址,因此我们就可以将一些函数地址存入数组中,这样我们就得到了函数指针数组。
int (*p[10])();
p先和[ ]结合,说明p是数组,数组的内容是int (*)()类型的函数指针。
以上就是函数指针的使用。
举个例子能更好的明白
int Add(int a, int b)
{
return a + b;
}
int Sub(int a, int b)
{
return a - b;
}
int Mul(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, Add, Sub, Mul, Div }; //转移表
while (input)
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf("*************************\n");
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 >=5 )
printf("选择错误,请重新输入!\n");
}
printf("退出计算器\n");
return 0;
}
三、指向函数指针数组的指针
指向函数指针数组的指针是一个指针。指针指向一个 数组 ,数组的元素都是 函数指针 。
四、回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
下面是qsort函数的使用:
qsort函数的返回值是void,base负责接收传入的地址,类型是void*,使用空指针的好处是可以接受各种类型的数据地址;num是待排序的元素个数,类型是size_t(无符号整型);size是单个元素的大小,类型也是size_t;compar是一个函数指针,返回值是int,还有两个形参。
qsort函数还可以用于字符型排序,结构体型排序。
到这里指针的内容基本已经更新完了,希望可以更好的帮助大家了解指针,继续探索指针的奥妙,征服指针。
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。