【问题标题】:Function Pointer Variable函数指针变量
【发布时间】:2013-11-18 15:13:00
【问题描述】:

我正在尝试创建一个函数变量,该变量指向一个可以传递给qsort() 函数的函数,当我尝试运行时收到“assignment type mismatch”错误下面的代码。

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 *到底是什么?

【问题讨论】:

  • int (*ptr)(const void *, const void *);
  • qsort 的手册页显示了作为qsort() 声明一部分的必要声明方式。

标签: c function-pointers qsort


【解决方案1】:

您的指针声明不是函数指针。它只是一个普通的指针。应该改成如下声明函数指针。

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

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

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

【讨论】:

    【解决方案2】:

    函数指针声明如下:

    return_type (* variable_name)(params)
    

    所以在你的情况下:

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

    【讨论】:

      【解决方案3】:

      因为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;,因为函数名称会自动转换为函数指针。

      【讨论】:

        【解决方案4】:

        您的函数指针声明不正确。您正在声明一个常规指针。 函数指针声明的语法是:

        <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 *指针指向的数据不能在函数中修改。

        【讨论】:

          【解决方案5】:

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

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

          强调的部分显然必须是你要找的。​​p>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多