0

我正在尝试创建一个指向可以传递给函数的函数的函数变量,当我尝试运行以下代码时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 *什么吗?

4

5 回答 5

2

您的指针声明不是函数指针。它只是一个普通的指针。应改为声明函数指针,如下所示。

int (*fptr) (const void *a, const void *b);
fptr = compareFunc;

对于函数指针,您永远不必使用 & 运算符显式获取地址。

const void *意味着指针指向的对象/数据不会在该函数中被修改。因此,每当您对指针指向的值执行写操作时,编译器都会引发错误。

于 2013-11-07T04:37:57.757 回答
1

函数指针声明如下:

return_type (* variable_name)(params)

所以在你的情况下:

int (*cfptr)(const void * a, const void * b);
cfptr = compareFunc;
于 2013-11-07T04:39:42.660 回答
0

做一个man qsort,你会得到(除了更多):

void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *) );

强调的部分显然必须是您正在寻找的。

于 2013-11-07T08:28:25.487 回答
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;,您可以省略代替 ,&因为函数名称会自动转换为函数指针。

于 2013-11-07T04:38:23.967 回答
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 *指针指向的数据不能在函数中修改。

于 2013-11-07T04:38:58.627 回答