qsort的使用以及*(char**)p与(char*)p之间的区别
来源:互联网 发布:ios游戏数据修改方法 编辑:程序博客网 时间:2024/05/22 01:50
qsort是万能数组排序函数,必须要学会使用,简单的数组自然不用说,这里主要讨论一下字符串数组的使用。
首先看一下qsort的原型:
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
正确使用这个函数要注意几点:
1.base要传数组的首地址
2.size传的是每个元素的大小
3.正确编写compare函数
下面是实际应用:
一个字符串数组:*str[MAX],假设里面现在保存了n个字符串了。
首先要正确理解什么是字符串数组,简单的说,可以理解成它就是一个数组,只不过其中的元素是一串字符串,而访问这些字符串,得用指针,也就是它们的地址,比如*name[]={"james","henry"},那么访问其中的字符串就是name[0],name[1]...这里就有个容易混淆的地方了,对于字符串数组,那么每个元素的大小到底是多少呢?对name[0]来说,到底是字符串“james”的长度5,还是char*的大小4呢?答案应该是4,因为字符串数组里面保存的是各个字符串的指针,所以回到上面所说的第二点注意,用qsort的时候应该要传sizeof(char *);
第二,编写compar函数比较字符串有地方要注意:
不能把strcmp本身传给qsort,即不能写strcmp(p,q),因为形参是const void*类型,同理,写成strcmp((char *)p, (char *)q);也是无效的;正确的写法应该是:strcmp(*(char **)p, *(char **)q);先强制转换成char**,在用*减少一层间接寻址操作:
int compar_words(const void *p, const void *q)
{
return strcmp(*(char **)p, *(char **)q);
}
大家可以好好体会一下。对于上面的应用,最后使用qsort应该是这样:
qsort(str, n, sizeof(char *), compar);
首先看一下qsort的原型:
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
正确使用这个函数要注意几点:
1.base要传数组的首地址
2.size传的是每个元素的大小
3.正确编写compare函数
下面是实际应用:
一个字符串数组:*str[MAX],假设里面现在保存了n个字符串了。
首先要正确理解什么是字符串数组,简单的说,可以理解成它就是一个数组,只不过其中的元素是一串字符串,而访问这些字符串,得用指针,也就是它们的地址,比如*name[]={"james","henry"},那么访问其中的字符串就是name[0],name[1]...这里就有个容易混淆的地方了,对于字符串数组,那么每个元素的大小到底是多少呢?对name[0]来说,到底是字符串“james”的长度5,还是char*的大小4呢?答案应该是4,因为字符串数组里面保存的是各个字符串的指针,所以回到上面所说的第二点注意,用qsort的时候应该要传sizeof(char *);
第二,编写compar函数比较字符串有地方要注意:
不能把strcmp本身传给qsort,即不能写strcmp(p,q),因为形参是const void*类型,同理,写成strcmp((char *)p, (char *)q);也是无效的;正确的写法应该是:strcmp(*(char **)p, *(char **)q);先强制转换成char**,在用*减少一层间接寻址操作:
int compar_words(const void *p, const void *q)
{
return strcmp(*(char **)p, *(char **)q);
}
大家可以好好体会一下。对于上面的应用,最后使用qsort应该是这样:
qsort(str, n, sizeof(char *), compar);
由此可见,小小的一个qsort使用,对基本概念的理解得比较深刻。由此可见基础扎实的重要性^_^
这里着重介绍一个问题:
即*(char**)p与(char*)p之间的区别
*(char**)p,由于传进来的p已经是一级指针啦(即发生了退化),而这样强制类型转化之后,p是一个二级指针,即此时*p中的内容是一个指针,即*p是一个字符串指针
(char*)p经过强制类型转换之后,p是一个指向字符的指针,即*p是一个字符
0 0
- qsort的使用以及*(char**)p与(char*)p之间的区别
- char *p 与 char p[]的区别
- char *p和 char p[]的区别
- char *p和 char p[]的区别?
- char* p 和 char p[] 的区别
- const char *p,char const *p, char * const p之间的区别
- char *const p;与 const char * p;的区别
- 编程:char *const p;与 const char * p;的区别
- 函数参数为 "char* p" 与 "char*& p" 的区别
- const char *p与char * const p的区别
- char *const p 与 const char * p 的区别
- const char *p;与char * const p;的区别
- (笔记)char * p与 char p[ ] 的区别
- char *const p;与 const char * p;的区别
- 函数参数为 "char* p" 与 "char*& p" 的区别
- const char* p , char const* p 以及 char * const p的区别?
- char* p与char p[]的不同
- const char *p,,char const *p,,cahr * const p 三者之间的区别
- 剑指Offer:面试题41 和为s的两个数字
- 浅谈大型web系统架构
- 教你6步定制你的Ubuntu桌面
- 剑指Offer:面试题42 反转单词顺序
- [UnitTest04]-Moq判断方法的执行情况
- qsort的使用以及*(char**)p与(char*)p之间的区别
- C++中数字与字符串之间的转换
- stm32学习笔记——按键(外部中断)
- ruby处理文本
- 剑指Offer:面试题43 n个骰子的点数
- Oracle -PLSQL存储过程游标当出参
- ruby加载路径$Load_Path
- 剑指Offer:面试题44 扑克牌的顺子
- hdu 4003 Find Metal Mineral(树形DP+分组背包)