qsort排序字符串

qsort排序指针数组(升序)


#include
#include
#include

int cmp(const void* e1, const void* e2)
{
	return strcmp(*(char**)e1, *(char**)e2); //其实最关键的是这一步为什么不是 strcmp((char*)e1, (char*)e2);

}
int main()
{
	char* arr[3] = { "hcia","ccie","aacp" };

	qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),cmp);
    
	return 0;
}

首先我们要知道char* arr[3] = { "hcia","ccie","aacp" };存的是什么。

根据指针数组的定义我们来解读这段代码:这是一个数组 有3个元素每个元素都是char*型的指针

qsort排序字符串_第1张图片

通过调试我们可以看到指针数组不仅存的有指针还有字符

我们知道 字符指针 存字符串存的是字符串首字符的地址,通过调试我们可以看到的确如此。

可以画图来理解一下
qsort排序字符串_第2张图片

重点:如何理解(*(char**)e1, *(char**)e2)

从第一个“hcia”开始比:
*(char**)e1举例:
首先第一颗* 相当于强制转换后(char*)e1 指向char *arr[0]的地址;
第二颗*    相当于(char**)e1指向"hcia"的地址;

最后解引用 *(char**)e1 就得到内容"accp";


交换完后调试的效果
qsort排序字符串_第3张图片

本篇完成于2022.1.25仅代表个人的理解,不知道是否正确。

你可能感兴趣的:(C语言笔记,排序算法,c语言,指针,c++)