使用qsort进行快速排序过程中需要传递一个比较函数,这个函数有两个参数,形如const void *a, const void *b,具体转换成哪种类型就要看情况了。
若是整形数组,则在比较函数中进行如下转换,*(int *)a , *(int *)b;
若是double,则在函数中进行如下转换,*(double *)a, *(double *)b;
但是有两种特殊情况。
一是二维字符数组
这个转换是这样的,strcmp((char *)a, (char *)b)
二是字符指针数组
这个转换是这样的,strcmp(*(char **)a, *(char **)b);
如何理解呢?
我觉得指针是一个数组,具体转换成哪种类型,就要看我们需要什么类型,以及指针值表示的地址所在位置。
所以二维字符数组,比如char a[200][2],是如下形式:
[][] [][] [][]
所以a指向开头,&a[1] 指向第二块,我们在参数要做的就仅仅是转换成char *s类型即可。
而指针数组又是另外一回事了。比如char *a[200],形如
[0x1bcaa][0xaaaa]
所以a指向第一个元素,&a[1]指向第二个元素,我们在参数要做的就是转换成*(char **)即可。