2011-04-05 60 views
0
#include <stdlib.h> 

int int_sorter(const void *first_arg, const void *second_arg) 
{ 
    int first = *(int*)first_arg; 
    int second = *(int*)second_arg; 
    if (first < second) 
    { 
     return -1; 
    } 
    else if (first == second) 
    { 
     return 0; 
    } 
    else 
    { 
     return 1; 
    } 
} 

int main() 
{ 
    int array[10]; 
    int i; 
    /* fill array */ 
    for (i = 0; i < 10; ++i) 
    { 
     array[ i ] = 10 - i; 
    } 
    qsort(array, 10 , sizeof(int), int_sorter); 
    for (i = 0; i < 10; ++i) 
    { 
     printf ("%d\n" ,array[ i ]); 
    } 

} 

我不明白這行:函數指針的問題用C

int first = *(int*)first_arg; 

任何人都可以幫助我嗎?解釋一下?非常感謝你!!!

這是鑄造嗎?明確演員,從void*int?但爲什麼我們需要在()以外的符號?

+0

「爲什麼我們需要一個*符號* outside()?」? – Mehrdad 2011-04-05 04:03:26

回答

9

你是第一個鑄造void指針爲int指針: (int*)first_arg

然後取消引用指針:*(int*)first_arg得到它所指向的整數。然後將其分配給一個整數變量。

3
int first = *(int*)first_arg; 

是一樣的:

int* ptrToFirst = (int*)first_arg; 

這是常量無效*顯式轉換爲int。

int first = *ptrToFirst; 

這裏的*是解引用操作符。這是發音'明星'。

這是'&符':'&'。

我們爲什麼要這樣做? qsort()需要回調確定排序。通過間接地將值作爲const void指針傳遞,回調的參數具有固定大小,即使值可以是任何大小。這就是爲什麼這些值需要回調回調。