2017-10-14 86 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 

所以你的代碼的問題,可以在別處。