2017-10-14 61 views
0

假设我有一个名为Student的结构。我有一个学生指针数组。qsort() - 比较函数参数

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); 
} 

的快速排序的最后部分是什么,我不明白。我看到他们写了&compare的一些帖子,以及一些他们没有写的帖子。只有当我使用&compare它工作。
我如何知道是否使用&

+2

函数与数组在一种方式上类似:如果函数在指向函数的指针时使用,它将*衰减*到指针。通常使用例如安全'比较',但我建议你使用'&compare'来使代码读者更加明确。 –

+4

你不需要任何装饰,只需通过比较。 – Amit

+0

'&'是明确的/可读的,其用法与&array [0]完全相同:对任何知道该语言的人来说,都是令人困惑和无耻的丑陋。只需使用'compare'或'array'。请注意,在每次调用函数**时,如'func(x)'中的函数**,func的名称正在衰减为一个指针,因为'()'运算符(函数调用)需要一个函数指针作为其操作数。 –

回答

1

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

0

你尝试调用的功能等,例如:)

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

或类似

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

按照C标准(6.3.2.1左值,数组和功能指示器)

4函数指示符是一个具有函数类型的表达式。 除了当该值是sizeof operator65的操作数)或一元& 操作,功能指示器与类型“”函数返回 类型“”转换到具有类型“”指针 函数返回类型”的表达式'。因此,在这个表达式

***********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 

所以你的代码的问题,可以在别处。