【C语言】指针详细讲解(2)完结

一、函数指针

什么是函数指针呢?

其实就是指向函数的指针就叫函数指针

int main()
{
	int x = 5;
	int y = 10;
	int a = 5;
	int b = 5;

	int ret = Add(x, y);
	//p是函数指针,指向的函数是两个整形参数,返回值为整数
	int(*p)(int x, int y) = Add;//函数名就是函数的地址
	//int(*p)(int x, int y) = &Add;

	int sum = p(a,b);//利用指针来调用函数

	printf("%d\n",ret);
	printf("%d\n",sum);
	printf("%p\n", Add);
	printf("%p\n", &Add);
	printf("%p\n", p);
	return 0;
}

下面是运行结果:

如果将int(*p)(int x,int y)写成了int*p(int x,int y)
这样的写法是不对的根据优先级会变成这样
(int*)p(int x,int y)这样的意思就是
函数名为p它的参数是两个整型,返回值为整数指针

二、函数指针数组

首先我们要是到函数指针数组到底是什么?函数?指针?数组?

其实函数指针数组是数组,这个数组里面放的类型相同的函数指针,下面看我们代码分析

//首先我们创建三个类型相同的函数
void function1()
{
	printf("function1\n");
}

void function2()
{
	printf("function2\n");
}

void function3()
{
	printf("function3\n");
}

int main()
{
	//创建函数指针数组,并将相应的地址赋值给指针
	void(*functionarry[])() = { function1,function2,function3 };
	functionarry[0]();//调用第一个函数
	functionarry[1]();//调用第二个函数
	functionarry[2]();//调用第三个函数
	return 0;
}

 


三、加减乘除计算器

我们利用上面学的函数指针数组来模拟一个计算器

void sheet()
{
	printf("1.ADD\n");
	printf("2.SUB\n");
	printf("3.MUL\n");
	printf("4.DIV\n");
	printf("0.EXIT\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 (*operation[4])(int, int) = { ADD,SUB,MUL,DIV };
	int sel_oper = 0;
	int operand_1 = 0;
	int operand_2 = 0;
	do 
	{
		sheet();//首先我们选择需要运算的类型
		printf("请输入要选择的运算:");
		scanf_s("%d", &sel_oper);

		if ((sel_oper >= 1) && (sel_oper <= 4))//这里条件是为了防止输入错误
		{
			printf("请输入操作数:");
			scanf_s("%d %d", &operand_1, &operand_2);
		
			int ret = operation[sel_oper - 1](operand_1, operand_2);
			//使用函数指针数组,将选择的结果直接赋值为数组下标,在输入操作数
			printf("结果是:%d\n", ret);
		}
		else if(sel_oper==0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("选择错误,请重新选择\n");
		}
		printf("\n");
	} while (sel_oper);
	return 0;
}

四、指向函数指针数组的指针

指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素是函数指针。

int ADD(int x, int y)
{
	return 0;
}

int main()
{
	//首先我们创建一个函数指针
	int (*p)(int, int);
	//创建一个函数指针数组,包含5个函数指针
	int (*parry[5])(int, int);
	//将函数指针数组第一个函数指针拿出来,将ADD的地址给它
	parry[0] = ADD;
	//指针pparry指向了int(*()[5])(int,int)函数指针数组
	// 有5个函数指针,函数的输入是两个整型,返回值是整型。
	int (*(*pparry)[5])(int, int) = &parry;
	return 0;
}

五、回调函数

       回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
//回调函数实现例子
//实现f(x)=X^2+2X+1

int function1(int x)
{
	return x * x;
}

int function2(int y)
{
	return 2 * y;
}

int function3(int x,int y,int(*p1)(int), int(*p2)(int))//回调函数
{
	int sum = p1(x) + p2(y) + 1;
	return sum;
}

int main()
{
	int a = 3;
	int ret = function3(a, a, function1, function2);//函数名就是函数地址
	printf("%d", ret);
	return 0;
}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值