qsort() - 比较函数参数

时间:2017-10-14 13:56:27

标签: c pointers qsort

假设我有一个名为Student的结构。

typedef struct student {
    int age;
    char name[10];
} Student;

我有一系列指向学生的指针。

Student *a[10];

我需要按照学生的名字对数组进行排序。所以我写了比较函数:

int compare(const void *a, const void *b){
    Student *temp1=*(Student **)a;
    Student *temp2=*(Student **)b;
    return strcmp(temp1->name, temp2->name);
}

然后我有了排序功能:

void SortArray(Student *a[], int len){
    qsort(a, len, sizeof(Student *), *compare*);
    printArray(a);
}

qsort的最后一部分是我没有得到的。我看到他们写了&compare的一些帖子,还有一些他们不写的帖子。只有当我使用&compare时才有效 我如何知道是否使用&

2 个答案:

答案 0 :(得分:1)

作为函数引用的函数的名称,您可以使用函数的名称。另外,如评论中所述,&也可以参考。

答案 1 :(得分:0)

您是否尝试过调用该函数,例如:)

qsort(a, len, sizeof(Student *), ***********compare);

或喜欢

qsort(a, len, sizeof(Student *), &***********compare);

根据C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

4函数指示符是具有函数类型的表达式。   除非它是sizeof operator65)或一元&的操作数。   operator,函数指示符,返回类型为''的函数   type''转换为类型为''指针的表达式   函数返回类型''

所以在这个表达式中

***********compare

函数指示符compare被隐式转换为函数指针,然后应用解除引用它又转换为函数类型,然后再转换为函数指针等等。

当然,您可以明确指定&compare,尽管没有必要。

这是一个示范程序

#include <stdio.h>

void f(void)
{
    puts("Hello eitanmayer");
}

void g(void f(void))
{
    f();
}

int main( void )
{
    g(&******f);
}

它的输出是

Hello eitanmayer

所以代码的问题可能在其他地方。