2011-04-05 54 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指针传递,回调的参数具有固定大小,即使值可以是任何大小。这就是为什么这些值需要回调回调。