快速排序的內部實施被聲明爲的qsort
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
我想知道如何快速排序實現反射特性。我的意思是它如何調用我們傳遞的名字的函數?
快速排序的內部實施被聲明爲的qsort
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
我想知道如何快速排序實現反射特性。我的意思是它如何調用我們傳遞的名字的函數?
qsort
收到一個指向接收兩個指針並返回int
函數的指針,就是這樣。這個指針被稱爲compar
。所有的qsort需要做的,調用這個函數是一樣的東西:
(*compar)(base+i, base+j);
凡i
和j
是base
偏移。這真的很簡單。你可以看到以K & r第二版一個可能的實現,部分5.11,第120頁:
void qsort(void *v[], int left, int right, int (*comp)(void *, void *)) {
int i, last;
void swap(void *v[], int, int);
if (left >= right)
return;
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[left]) < 0) /* Here's the function call */
swap(v, ++last, i);
swap(v, left, last);
qsort(v, left, last-1, comp);
qsort(v, last+1, right, comp);
}
引用一個引用非常好... +1 – Rerito
你能解釋爲什麼'int left,int right'而不是'size_t array_size,size_t elm_size'? –
什麼qsort
接收是起作用的指針,所以它需要的所有才能使用該功能做的是排序指針的引用。
函數指針是語言標準中定義明確的類型,並且在那裏沒有任何反射魔法。 –
沒有名字被傳遞。函數指針被傳遞。 –
@Charlie - 語義問題,在引用函數方面,'name'與'symbol'同義使用是不是真的? _function我們通過的名字_似乎是一個合理的短語。 – ryyker