You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

qsort用Player比较函数报错:‘*p1’是指针,需用‘->’?如何正确比较?

qsort比较函数的错误修正与正确写法

以下是我用于qsort的Player姓名比较函数:

int cmp_Player_name(Player **p1, Player **p2){
   if (*p1->name > p2->name){
      return 1;
   }
   if (p1->name < p2->name){
      return -1;
   }
   if (p1->name == p2->name){
      return 0;
   }
}

运行时触发报错:

error: '*p1' is a pointer; did you mean to use '->'?

我尝试了以下几种方式,都没法正确比较:

  • (*p1->name > *p2->name)
  • (*(*p1)->name
  • 初始化char变量后进行比较

正确的解决方法

1. 先解决运算符优先级问题

->的优先级比*高,所以*p1->name会被编译器解析成*(p1->name),但p1是Player**类型,不能直接用->访问成员。必须先解引用p1得到Player*,再用->访问name,也就是写成(*p1)->name,同理p2要写成(*p2)->name。

2. 字符串不能直接用>、<、==比较

直接用关系运算符比较字符串,实际上比较的是字符串指针的内存地址,不是字符串内容。C语言中必须用strcmp函数来比较字符串内容。

最终正确代码

#include <string.h> // 必须包含strcmp的头文件

int cmp_Player_name(Player **p1, Player **p2){
    const char* name1 = (*p1)->name;
    const char* name2 = (*p2)->name;
    // strcmp的返回值正好符合qsort的要求:
    // 大于0表示name1>name2,小于0表示name1<name2,等于0表示相等
    return strcmp(name1, name2);
}

这样写既解决了运算符优先级导致的编译错误,又能正确比较字符串内容,完全符合qsort比较函数的规范。

内容的提问来源于stack exchange,提问作者Programming_jager

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:00:57