看这篇之前可以去看看函数指针数组应用,指针里的知识点确实很多呢。
比如:指针数组、数组指针、函数指针、函数数组指针、指向函数数组指针的指针、回调函数。
还要搞清楚 arr 和 &arr 的区别,一个是首元素地址,一个是数组的地址。
支持不同数据类型排序
用到回调函数知识写的一个bubble_sort,支持多种数据类型冒泡排序。
冒泡排序是有外部和内部循环的,外部loop是有几趟,内部loop是比较的对数。这样记是不是很直观呢~
但是我们接触到的一般都是int类型,那怎么实现不同数据类型的排序呢?
void bubble_sort(void* base, int sz, int width, int(*cmp)(void* e1, void* e2))
{
int i = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
int j = 0;
//每一趟比较的对数
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
这个函数的第四个参数 是一个函数指针,也就是说,接收一个函数地址。
全部代码:
#include <stdio.h>
struct stu
{
char* name;
int age;
};
void Swap(char* a, char* b, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
a++;
b++;
}
}
void bubble_sort(void* base, int sz, int width, int(*cmp)(void* e1, void* e2))
{
int i = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
int j = 0;
//每一趟比较的对数
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void test1()
{
int j = 0;
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
for (j = 0; j < sz; j++)
printf("%d ", arr[j]);
}
int cmp_stu_by_name(const void* e1, const void* e2)
{
//箭头-> 优先级 高于 强制转换
//字符串比较-strcmp
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
//结构体数组
void test2()
{
struct stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };
int sz = sizeof(s) / sizeof(s[0]);
bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
test2();
return 0;
}
可实现不同数据类型的冒泡排序,每次只需要传递 函数地址。
有关 void*
1、void*类型的指针,可以接收任意类型的地址(地址垃圾桶不是)
2、void* 类型的指针不能进行解引用操作,因为他不知道要访问几个字节,地址垃圾桶,垃圾那么多哈哈
3、void*类型的指针,不能进行加减整数的操作。
关于强制类型转换
假设 本来有 char b;
我们把它强制类型转换 就成了 (int)b;
相同的,假设一个变量 本来有:
void* e;
强制类型转换就是(int* )e;
总结起来,就是(要转化的数据类型)变量名