C 语言 void 指针

发布于 2024-03-25 10:53:32 字数 1974 浏览 22 评论 0

(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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

金兰素衣

文章 0 评论 0

ゃ人海孤独症

文章 0 评论 0

一枫情书

文章 0 评论 0

清晰传感

文章 0 评论 0

mb_XvqQsWhl

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文