3 回答

TA貢獻1812條經驗 獲得超5個贊
因為cmp在傳入qsort的時候是作為函數指針傳入的,qsort在調用cmp(就是“回調函數”)的時候會傳入合適的參數。
*(int*)a是因為:a是個void *類型,要先用(int*)將它轉成int*類型,然后再用*取值,變成int類型,才能比較大小。

TA貢獻1847條經驗 獲得超11個贊
你這個 cmp和qsort中的cmp是一樣的寫法 應該說 qsort在排序的時候 會自動為cmp賦值參數 因為qsort中的cmd的參數原型就是這樣的 這是他內部的比較機制 也就是這么規定的
對于下面的
int cmp( const void *a, const void *b){ return *( int *)a - *( int *)b; } |
中的*(int*)a 可以看到 由于cmp函數要返回的int 切參數a,b都是指針形式的 但是不知道類型
所以比較的時候進行強制轉換為int型的指針 然后通過括號外的*取得各自的int值大小進行各自變量的差值運算 得出各自變量的大小 后返回供 qsort內部調用 這些其實都是在qsort內部完成的 你的提問很好 很好的剖析了他的原理 共勉

TA貢獻1873條經驗 獲得超9個贊
頭文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的占用空間大小
4 指向函數的指針,用于確定排序的順序
#########################################
qsort(a,n,sizeof(a[0]),cmp); // cmp是一個回調函數,我們必需按照qsort的函數聲明中約定好的形式定義并且實現該函數,也就是說qsort需要的是一個函數指針,而函數名恰恰就是
########################################
*(int *)a // 因為a的類型是 void * ,先進行強制類型轉換為 int *, 然后取值做差
添加回答
舉報