#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*型的指针
通过调试我们可以看到指针数组不仅存的有指针还有字符
我们知道 字符指针 存字符串存的是字符串首字符的地址,通过调试我们可以看到的确如此。
重点:如何理解(*(char**)e1, *(char**)e2)
?
从第一个“hcia”开始比:
以*(char**)e1
举例:
首先第一颗* 相当于强制转换后(char*)e1 指向char *arr[0]
的地址;
第二颗* 相当于(char**)e1
指向"hcia"的地址;
最后解引用 *(char**)e1
就得到内容"accp";
本篇完成于2022.1.25仅代表个人的理解,不知道是否正确。