指针函数和函数指针

对应谭浩强第八章指针的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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值