对应谭浩强第八章指针的8.5节 指向函数的指针(函数指针)8.6返回指针值的函数(指针函数)
函数指针
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。
函数指针的定义形式为:returnType (*pointerName)(param list);
returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。
注意( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为returnType *。
例子:int fun(int x, int y, int(*p)(int, int));//函数指针作为参数
#include<stdio.h>
int min(int x, int y) {
int z;
if (x > y) z = y;
else z = x;
printf("最小值为");
return z;
}
int max(int x, int y) {
int z;
if (x > y) z = x;
else z = y;
printf("最大值为");
return z;
}
int sum(int x, int y) {
int z;
z = x + y;
printf("两数之和为");
return z;
}
int fun(int x, int y, int(*p)(int, int)) {
int result;
result = (*p)(x, y);
printf("%d\n", result);
return result;
}
int main() {
int fun(int x, int y, int(*p)(int, int));
int sum(int x, int y);
int max(int x, int y);
int min(int x, int y);
int a, b, n;
printf("请输入两个整数");
scanf_s("%d%d", &a, &b);
printf("请输入1或2或3决定你的操作(1为min,2为max,3为sum):");
scanf_s("%d", &n);
if (n == 1) fun(a, b, min);
else if (n == 2) fun(a, b, max);
else if (n == 3) fun(a, b, sum);
return 0;
}
小甲鱼的函数指针例子:四则运算
#include<stdio.h>
//函数声明
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
//函数定义
int add(int num1, int num2) {
return num1 + num2;
}
int sub(int num1, int num2) {
return num1 - num2;
}
int mul(int num1, int num2) {
return num1 * num2;
}int div(int num1, int num2) {
return num1 / num2;
}
int calc(int(*)(int, int), int num1, int num2);//函数声明
int calc(int(*fp)(int, int), int num1, int num2) {
return (*fp)(num1, num2);//函数指针作为返回值
}
//定义一个根据用户输入的运算符来选择计算方式的函数
int (*select(char op))(int, int);
int (*select(char op))(int , int ) {
switch (op) {
//switch...case语句
case'+':return add;
case'-':return sub;
case'*':return mul;
case'/':return div;
default:return 0;
}
}
//定义一下主函数
int main() {
int num1, num2;
char op;
printf("请输入一个四则运算的式子(如1+2)");
scanf_s("%d%c%d", &num1, &op,1, &num2);//注意这里在&op后面写上字符长度,否则就会报错:
//警告 C6273 传递了一个非整数作为_Param_(3),而对“scanf_s”的调用需要一个整数,
//实际类型: “char *”: 如果当前传递的是一个指针值,则应使用 %p。
int (*fp)(int, int);//定义一个函数指针
fp = select(op);
printf(" %d %c %d= %d\n", num1, op, num2, calc(fp, num1, num2));
return 0;
}
指针函数
指针函数是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
类型名 * 函数名(函数参数列表);
其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。
指针函数作用:可以在是代码更简洁并在一定程度节约内存;如当你需要返回一个数组中的元素时,你就只需返回首元素的地址给调用函数,调用函数即可操作该数组(让函数返回多个值)。
例子:
#include<stdio.h>
float* search(float(*pointer)[4], int n)//形参pointer是指向一维数组的指针变量
{
float* pt;
pt = *(pointer + n);
return pt;//指针函数返回类型是某一类型的指针
}
int main() {
float* search(float(*pointer)[4], int n);
float score[][4] = { {56,54,89,56},{50,54,89,56}, {53,54,89,56} };
float* p;
int i, k;
printf("输入学生的序号:");
scanf_s("%d", &k);
printf("第%d位学生的成绩为:",k);
p = search(score, k);
for (i = 0; i < 4; i++)
printf("%5.2f ", *(p + i));
printf("\n");
return 0;
}
指针函数用于返回多值,
函数指针更为灵活,通过用户的选择调用不同的函数
参考:https://ask.csdn.net/questions/1058839
https://blog.csdn.net/baidu_37973494/article/details/83150266