函数指针和回调函数

文章介绍了C语言中函数指针的使用,包括简单的赋值、函数指针数组和typedef简化语法。还通过回调函数的概念展示了如何在排序算法中实现灵活的升序或降序排列,以及使用标准库函数qsort进行通用排序的方法。
摘要由CSDN通过智能技术生成

1.函数指针的简单用法

#include <stdio.h>
int add(int a, int b)
{
	return a + b;
}
int dec(int a, int b)
{
	return a - b;
}
int mult(int a, int b)
{
	return a * b;
}

int main()
{
	int (*p)(int a, int b) = NULL;
	p = mult;
	int n = (*p)(66, 77);
    p=&add;
	p = add;//也可以不取地址符
	int m = (*p)(22, 33);
	//也可以简易调用,不用加*,编译器会自己处理
	int m = p(33, 44);
}

2.函数指针变量的数组

int (*p[8])(int a, int b) = { NULL };

3.用typedef来简化以上语法

#include <stdio.h>
int add(int a, int b)
{
	return a + b;
}
int dec(int a, int b)
{
	return a - b;
}
int mult(int a, int b)
{
	return a * b;
}
//此时FUNC_PTR不是一个变量,而是一个类型
typedef int(*FUNC_PTR)(int, int);

int main()
{
	FUNC_PTR p1, p2, p3;

	FUNC_PTR a[8] = { NULL };
	return 0;
}

4.回调函数

小案例

//出自B站<<4个小时掌握C指针>>

#include <iostream>
using namespace std;
void A()
{
	cout << "hello" << endl;
}
void B(void(*ptr)())//函数指针做参数
{
	ptr();
}
int main()
{
	//声明一个函数指针
	void (*p)() = A;//等价于void (*p)()=NULL;p=A;
	B(p);

	//以上两条语句也可以简化成B(A); 因为函数的名字返回的就是指针
	
}

实用场景:实现多种排序规则的排序算法

//出自B站<<4个小时掌握C指针>>

#include<iostream>
using namespace std;
void swap(int* num1, int* num2)//交换两个变量的值
{
	int temp = *num1;
	*num1 = *num2;
	*num2 = temp;
}
void BubbleSort1(int arr[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		
		for (int j = 0; j < len - i - 1; j++)
		{
			
			if (arr[j] > arr[j + 1])//如果想实现降序,只需修改这行代码,把大于号变成小于号
			{
				swap(&arr[j], &arr[j + 1]);
				
			}
		}
	}
}


//思考,有时想实现降序排列,有时想实现升序排列,如何实现
//第一个方法,写两个排序函数,但是这样会有很多冗余的重复代码
//第二个方法,多传一个参数给排序函数,告诉它选择升序还是降序
int compare1(int a, int b)//回调函数,把升序规则单独剥离出来
{
	if (a > b)
		return 1;
	else
		return -1;
}
int compare2(int a, int b)//回调函数,把降序规则单独剥离出来
{
	if (a < b)
		return 1;
	else
		return -1;
}

void BubbleSort2(int arr[], int len, int(*compare)(int, int))//多传一个函数指针作为参数
{
	for (int i = 0; i < len - 1; i++)
	{

		for (int j = 0; j < len - i - 1; j++)
		{

			if (compare(arr[j], arr[j + 1] )> 0)
			{
				swap(&arr[j], &arr[j + 1]);

			}
		}
	}
}
int main(void)
{
	 int arr[9] = { 7,5,2,4,9,8,6,7,1 };
	int len = sizeof(arr) / sizeof(arr[0]);
	BubbleSort1(arr, len);

	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	BubbleSort2(arr, len,compare1);//升序
	
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	BubbleSort2(arr, len, compare2);//降序

	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}

自己编写的BubbleSort只能实现一种数据类型的数组的排序

想要接收任意的数组,需要调用库函数qsort(),该库函数包含在stdlib.h中,qsort()需要传入的四个参数自行查阅csdn


//出自B站<<4个小时掌握C指针>>

#include<stdio.h>
#include<stdlib.h> 
//利用库函数实现排序功能,需要指定排序规则
int compare_int(const void* a, const void* b)
{
	int* a1 = (int*)a;
	int* b1 = (int*)b;
	return *a1 - *b1;//此时是执行升序规则,如果是return *b1-*a1;则是降序功能
}
int main()
{
	int arr[] = { 2,4,2,4,6,8,3 };
	int n = sizeof(arr) / sizeof(arr[0]);
	qsort(arr,n,sizeof(int), &compare_int);//可省略取地址符,可以接收任意数据类型的数组
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值