![](/img/trans.png)
[英]Difficulty understanding how to pass this void function as a parameter to another function
[英]understanding how cmp (comparator functions) is used as arguments to another function
一段時間以來,這一直使我感到困惑,不確定是否有人可以理解我要開車去的地方
資料來源: https : //www.oreilly.com/library/view/algorithms-in-a/9780596516246/ch04s06.html
我想弄清楚傳遞cmp作為buildHeap的參數到底做了什么
buildHeap (ar, cmp, n);
這本書似乎將cmp描述為比較器功能( qsort中的比較功能如何工作? ),並且
static void buildHeap (void **ar, int(*cmp)(const void *,const void *), int n) {
我說對了嗎
int(*cmp)(const void *,const void *)
從本質上講,C與C#中的委托等效嗎?
也就是說,將cmp傳遞到buildHeap會告訴buildHeap要實現的功能是比較器功能(適合以下功能的簽名):
int(*cmp)(const void *,const void *)
我可以通過另一種方式教buildHeap在不傳遞cmp的情況下執行比較器功能嗎?
buildHeap
的cmp
參數是一個函數指針 ,它指向具有兩個const void *
參數的函數,這些參數返回一個int。 buildHeap
可以使用此函數指針來調用有問題的函數以比較兩個項目。
例如,如果要比較兩個整數,則可以實現如下函數:
int compare_int(const void *p1, const void *p2)
{
const int *a = p1;
const int *b = p2;
if (*a > *b) {
return -1;
} else if (*a < *b) {
return 1;
} else {
return 0;
}
}
然后,您將把compare_int
作為第二個參數傳遞給buildHeap
,即buildHeap(arr, compare_int, n)
。 然后在buildHeap
某個地方可以適當地調用此函數:
void buildHeap (void **ar, int(*cmp)(const void *,const void *), int n) {
...
cmp(ar[x], ar[y]);
...
}
在buildHeap
內部調用cmp
實際上會調用compare_int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.