2014-12-24 71 views
3

我打算使用qsort from stdlib.h。快速排序需要一個比較函數的參數實現這一點:我瞭解這個C函數(qsort比較函數)嗎?

int (*compar)(const void *, const void*) 

我說得對閱讀本作,「指針爲int-返回函數F F必須考慮兩個參數是通用的指針。」?我不確定'* compar'周圍的括號的含義 - 有沒有我可以查找的名稱?

的鏈接提供了一個示例:

int cmpfunc (const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

我將是正確的閱讀*爲(int *)一個爲「解引用的a的值,它已被鑄造爲指針的整數後」?

乾杯。

回答

8

我正確地讀到這個:「一個指向int返回函數f.f的指針必須帶有兩個泛型指針參數」?

沒錯。

我不能肯定的括號的含義周圍*compar

這對於聲明函數指針的(這是所謂的「函數指針」)的語法。如果沒有括號,這將是一個函數聲明

// Declares a function named compar. (It returns an int*.) 
int *compar(const void *, const void*); 

// Declares a function pointer named compar. (The func returns an int.) 
int (*compar)(const void *, const void*); 

我會是正確的閱讀*(int*)a爲「提領的價值,它已被強制轉換爲一個指向整數後」?

再次校正。它給出int地址a

1

是的。你正在理解這兩種語法。括號()*compar意味着compar是函數指針。如果沒有它,意義將完全不同。

4

你在正確的道路上。

在您的第一個示例中,compar被稱爲Function pointer()是函數指針的語法的一部分。

請注,周圍沒有*compar明確()compar將被視爲一個溫控功能返回一個int *,接受2個void指針。

對於第二種情況,對於二進制減法運算符-,從C99標準的章節6.5開始。6,第3段,

- 兩個操作數都有算術類型;

- 兩個操作數都是指向合格或不合格版本兼容對象的指針 類型;或

- 左操作數是一個指向對象類型的指針,右操作數具有整數類型。 (遞減相當於減去1)

和第一點,所述arithmatic type,從章節6.2.5,第18段,

整數和浮點類型被統稱爲算術類型。

所以,在這裏,使用指針減法之前,它們是鑄造int指針,則解除引用和爲被用作操作數整數減法值(一個或多個)。

+0

@ikegami根本不是先生。請把這些話當作鼓勵的標誌[也是歡呼]。 :-) –