//int(*(*ppArr)[5])(int, int);看这个代码,*先和ppArr结合说明ppArr是一个指针,然后再和【5】结合说明这是一个数组指针,我们把(*paArr)【5】去掉来看效果
 
 
//int(*)(int, int); 
 
 #include<stdio.h>
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;
			}
		}
	}
}
struct Stu
{
	char name[20];
	int age;
};
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };
	bubble_sort(arr, sz);//这个冒泡排序类型只能排序整型,不能排序其他类型
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
} 
 
   
 
  这是一个函数,这就是一个函数指,且函数的返回类型为int型 给大家解释一下这四个参数分别代表的意思
给大家解释一下这四个参数分别代表的意思
base:目标数组的起始位置
num:数组的大小(单位为元素),也就是数组有几个元素
size:元素的大小(单位为字节),也就是一个元素的大小(单位为字节)
compar:比较
现在我们来看代码
#include<stdio.h>
#include<stdlib.h>
void qsort(void* base, size_t num, size_t size, int (*compar)(const void* e1, const void* e2));
int cmp_int(const void* e1, const void* e2)
{
}
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };//结构体数组
	//bubble_sort(arr, sz);//这个冒泡排序类型只能排序整型,不能排序其他类型
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
我们把cmp_int函数放到qsort这个函数中,,函数名和参数值以及返回类型和qsort的第四个参数的函数参数以及函数的返回值是一致的,所以我们就可以通过(*compar)找到cmp_int这个函数名(也可以叫做是函数的地址)大家这里可能有个疑问,我们见过int*,char*,double*,float*等等,但是没有见过void*,我这里给大家解释一下,我们来看代码
#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	void* p = &a;
	p = &pc;
	//void*类型的指针,可以接收任意类型的地址
} void*类型的指针,可以接收任意类型的地址
void*类型的指针,可以接收任意类型的地址
当我们要排序其他的类型(int*,char*等等),这是void就可以接收这些类型,就不用我们多次去改变变量类型
我们来看一下void*类型需要注意的事项,我们看代码
#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	void* p = &a;
	*p = 0;
	p++;
	//void*类型的指针,可以接收任意类型的地址
	//void*类型的指针,不能进行解引用操作
	//void*类型的指针,不能进行+-整数的操作
}
我们接着来看刚才我们写到的qsort函数,这里的void*指针变量的值不能被改变(不能解引用),我们需要强制类型转换,强制类型转换为int*类型的指针就可以进行*解引用了
打印出来是从小到大的升序数组
#include<stdio.h>
#include<stdlib.h>
//void qsort(void* base, size_t num, size_t size, int (*compar)(const void* e1, const void* e2));
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };//结构体数组
	//bubble_sort(arr, sz);//这个冒泡排序类型只能排序整型,不能排序其他类型
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
结构体数组的快速排序和float类型的快速排序我将在下一个博客的开头给大家做详细的讲解!
本章终,这一章节难度大,大家多消化理解一下












![【读书笔记】《小王子》- [法] 安托万•德•圣埃克苏佩里 / [法国] 安东尼·德·圣-埃克苏佩里](https://img-blog.csdnimg.cn/9a6a3f8fd36e49dc90e1a3eb0c77fc8d.png#pic_center)




![【Java入门】-- Java基础详解之 [数组、冒泡排序]](https://img-blog.csdnimg.cn/ab4fbf404e044c9cabbdd8d7ab2329d7.png)

