功能指针变量

时间:2013-11-07 04:33:25

标签: c function-pointers qsort

我正在尝试创建一个指向可以传递给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 *

5 个答案:

答案 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 *));

强调的部分显然必须是你想要的。