我正在尝试创建一个指向可以传递给qsort()
函数的函数的函数变量,当我尝试时收到“赋值类型不匹配”错误运行以下代码。
int compareFunc (const void * a, const void * b)
{
//codes
}
int main(void) {
int *ptr; //create a function pointer variable that point to compareFunc
ptr = &compareFunc //Initialize function pointer
//codes
return 0;
}
有人可以告诉我我做错了什么并解释究竟是什么const void *
?
答案 0 :(得分:2)
指针的声明不是函数指针。它只是一个常规指针。应该更改为声明一个函数指针,如下所示。
int (*fptr) (const void *a, const void *b);
fptr = compareFunc;
对于函数指针,您永远不必使用&;操作
同样const void *
表示指针指向的对象/数据不会在该函数中被修改。因此,只要对指针指向的值执行写操作,编译器就会引发错误。
答案 1 :(得分:1)
函数指针声明如下:
return_type (* variable_name)(params)
所以在你的情况下:
int (*cfptr)(const void * a, const void * b);
cfptr = compareFunc;
答案 2 :(得分:0)
因为int *
是一种对象指针,而不是函数指针。
您可以将其声明为int (*ptr)(const void *,const void *);
,或使用typedef
来简化声明函数指针:
typedef int (*comptr)(const void *a, const void *b);
int compareFunc (const void * a, const void * b)
{
//codes
}
int main(void) {
comptr ptr;
ptr = compareFunc;
//codes
return 0;
}
另请注意,您可以省略ptr = &compareFunc;
而不是&
,因为函数名称会自动转换为函数指针。
答案 3 :(得分:0)
您的函数指针声明不正确。您正在声明一个常规指针。 函数指针声明的语法是:
<return_type> (* func_ptr_Variable_name) ( [params...] )
函数指针应为:
int main(void){
int (*ptr)(const void *,const void *);
ptr = compareFunc; //'&' is not needed here, function name is automatically converted to its address
...
return 0;
}
const void *
只是意味着void *
指针指向的数据无法在函数中修改。
答案 4 :(得分:0)
做一个man qsort
,你会得到(除了更多):
void qsort(void * base,size_t nmemb,size_t size,
int(* compar)(const void *,const void *));
强调的部分显然必须是你想要的。