C语言指针讲解-------进阶篇(下篇)

目录

六.函数指针数组

七.指向函数指针数组的指针

八.回调函数

冒泡排序 与 qsort 函数 

冒泡排序

 qsort函数


六.函数指针数组

函数指针数组---数组存放的是函数

                      ---指针存放的是函数的地址

#define  _CRT_SECURE_NO_WARNINGS
#include
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int main()
{
	int (*pf1)(int, int) = &Add;
	int (*pf2)(int, int) = ⋐
	int (*pfArr[4])(int, int) = { &Add,&Sub };
	//*pfArr存放函数指针的数组
	//*pfArr[4]有4个元素,每个元素都是一个函数指针
	return 0;
}

看下面的代码 

case里面的语句,有好多重复

就可以利用函数指针数组去让下面的代码变得更简洁

void menu()
{
	printf("******************************\n");
	printf("***   1.Add        2.Sub   ***\n");
	printf("***   3.Mul        4.Div   ***\n");
	printf("***   0.Exit               ***\n");
	printf("******************************\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 input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("请输入2个操作数:");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
	return 0;
}

代码改进之后 

会使多余的代码删除

在            ret = pfarr[input](x, y);   中如果输入的input 是 1 ----->则进入Add的函数中,将x,y的值传到Add函数中,返回x+y,输入其他数字同理,要注意的是input的值必须(>=1且<=4)

void menu()
{
	printf("******************************\n");
	printf("***   1.Add        2.Sub   ***\n");
	printf("***   3.Mul        4.Div   ***\n");
	printf("***   0.Exit               ***\n");
	printf("******************************\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 input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
        //函数指针数组
		int (*pfarr[])(int, int) = { NULL,Add,Sub,Mul,Div };
  
		if (0 == input)
		{
			printf("退出程序!\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入2个操作数:");
			scanf("%d%d", &x, &y);
			ret = pfarr[input](x, y);
			printf("ret = %d\n", ret);
		}
		else
		{
			printf("选择错误,请重新选择!\n");
		}
	} while (input);
	return 0;
}

上述代码展示,如下图 

C语言指针讲解-------进阶篇(下篇)_第1张图片

 

七.指向函数指针数组的指针

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

int main()
{
	int a = 10, b = 20 , c = 30;
	int* arr[] = { &a,&b,&c };
	//整型指针数组
	int* (*p)[3] = &arr;
	//p是指针,是指向整形数组的指针



	//函数指针数组,存放的是函数的地址
	int(*pfArr[5](int, int) = { NULL,Add,Sub,Mul,Div };
	//pfArr是函数指针数组
	int (*(*p)[5])(int, int) = &Arr;
	// *p 是指针,指向数组,有5个元素
	// p  就是一个能够指向函数指针数组的指针
}

向函数指针数组 pfArr 的指针 p 就是一个能够指向函数指针数组的指针

( 博主在这里插一嘴,可以继续套娃哦)

八.回调函数

回调函数就是一个通过函数指针调用的函数

如果你把指针(地址)作为参数传给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数

回调函数不是由该函数的实践方直接调用,而是在特定的事件或条件发生发生时由另外的一方调用的,用于该事件或条件进行响应

代码演示,用回调函数实现计算器(上面的代码):

void menu()
{
	printf("******************************\n");
	printf("***   1.add        2.sub   ***\n");
	printf("***   3.mul        4.div   ***\n");
	printf("***   0.exit               ***\n");
	printf("******************************\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;
}
void calc(int (*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入2个操作数:");
	scanf("%d%d", &x, &y);
	ret = pf(x, y);
	printf("ret = %d\n", ret);
}
int main()
{
	int input = 0;

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			calc(Add);
			break;
		case 2:
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
	return 0;
}

冒泡排序 与 qsort 函数 

 

C语言指针讲解-------进阶篇(下篇)_第2张图片 

冒泡排序

代码展示:

void print_arr(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);//排序前
	bubble_sort(arr, sz);
	print_arr(arr, sz);//排序后
	return 0;
}

注意 : 这个函数只能排序整形类型 

 qsort函数
void qsort(void* base, //待排序数组的第一个元素的地址

	       size_t num, //待排序数组的元素个数

	       size_t size,//待排序数组中一个元素的大小

	       int (* cmp)(const void* e1, const void* e2)//函数指针-cmp指向了一个函数,这个函数是用来比较两个元素的

           e1和e2中存放的是需要比较的两个元素的地址
          );
//1. 排序整型数组, 两个整型可以直接使用>比较
//2. 排序结构体数组,两个结构体的数据可能不能直接使用>比较
   也就是不同类型的数据,比较出大小,方法是有差异的

qsort() 是 C语言的一个标准库函数,定义在头文件中。

qsort() 函数用于对数组进行快速排序,它是一个通用的排序函数,支持对不同类型的元素进行排序。

qsort() 函数的原型如下:

void qsort (void *base , size_t nitems , size_t size , int (*compar ) ( const void *, const void* ) );

欲知后事如何,请听下章分解 

 

新人博主,如果有地方解释的不对或者不清晰,麻烦大佬们海涵,如果可以麻烦从评论区指出,我一定会加以修改,万分感谢

最后麻烦大佬们动一下发财的小手一键三连,千万分感谢

你可能感兴趣的:(c语言)