C 语言 void 指针
(void*)x
指针能够保存任意类型的指针, void*
虽然是任意类型的指针但是使用前一定要转换成指定类型的指针,如下实例,比较数字大小,比较字符串:
// void* 可以是任意类型的指针 // 比较分数 int compare_scores(const void* score_a, const void* score_b) { // void* 虽然是任意类型的指针但是使用前一定要转换成指定类型的指针 // 从指针中提取值, (int*)score:把 void 指针->int 指针, 第一个*取地址(int 指针) 里的值 int a = *(int*)score_a; int b = *(int*)score_b; return a-b; } //降序比较分数 int compare_scores_desc(const void* score_a, const void* score_b) { int a = *(int*)score_a; int b = *(int*)score_b; return b-a; // 或者: return compare_scores(score_b, score_a); } typedef struct { int width; int height; } rectangle; //比较 areas int compare_areas(const void* a, const void* b) { // void*要转换成对应类型(rectangle) 的指针 rectangle* la = (rectangle*)a; // 声明 rectangle 类型的指针变量 la,并赋值 rectangle* lb = (rectangle*)b; int sa = (la->width * la->height); int sb = (lb->width * lb->height); return sa-sb; } //比较字符串,按字母序排列,区分大小写 int compare_names(const void* a, const void* b) { char** sa = (char**)a; // 字符串是字符指针,所以得到指针的指针 char** sb = (char**)b; return strcmp(*sa, *sb); // *取得字符串, a,b 的类型是 char**, 而 strcmp 需要比较的是 char*类型的值 } int main(int argc, char *argv[]) { int scores[] = {543,323,32,554,11,3,112}; int i; // qsort 排序并更新 // scores:作用对象, 7:总数, sizeof(int):每项大小,compare_scores_desc 比较函数 qsort(scores, 7, sizeof(int), compare_scores_desc); puts("There are scores with order;"); for(i=0; i<7; i++) { printf("%d\n", scores[i]); } char *names[] = {"Jack", "Ben", "Bezay", "Zen"}; // 字符串数组 names 每一项都是字符指针(char *), 当 qsort() 函数比较时会发送两个指向数组元素的指针 // 也就是说比较器函数接收到的是指向字符指针的指针,也就是 char** qsort(names, 4, sizeof(char*), compare_names); // sizeof(char *): 数组元素是字符串(字符指针数组),所以是 char* puts("names:"); for(int i=0; i<4; i++){ printf("%s\n", names[i]); } return 0; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: C 语言 函数指针
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论