2

我正在使用 qsort 库函数对结构元素数组进行排序,在 Internet 上搜索时,我找到了一个资源:INFO: Sorting Structures with the C qsort() Function @ support.microsoft。

我知道 qsort 函数需要通过通用指针进行类型转换。

但是我无法得到这条线:

typedef int (*compfn) (const void*, const void*);

已声明,以及随后的调用:

qsort((void *) &array,              // Beginning address of array
      10,                           // Number of elements in array
      sizeof(struct animal),        // Size of each element
      (compfn)compare               // Pointer to compare function
 );
  1. 表现如何typedef,我的意思是我们到底输入了 int (*compfn)什么int (compfn)
  2. 如果是前者,那么电话不应该是(*compfn)吗?
4

3 回答 3

8

句法:

typedef  int (*compfn)  (const void*, const void*);
  ^      ^       ^            ^          ^
  | return type  |               arguments type
  |             new type name 
  defining new type

compfntype是由typedef关键字定义的新用户,

因此,您已经完全按照 我上面描述的语法进行了int (*)(const void*, const void*);类型定义。comfn

声明:

 compfn  fun; // same as: int (*fun)  (const void*, const void*);

meanfun是一个函数指针,它接受两个const void*类型的参数并返回int

假设您有一个类似的功能:

int xyz  (const void*, const void*);    

然后您可以将xyz地址分配给fun.

fun = &xyz; 

打电话时qsort()

在表达式(compfn)compare中,您将函数类型转换compare(compfn)类型函数。

一个疑问:

电话不应该是(*compfn)

不,它的类型名称不是函数名称。

注意:如果你只是在int (*compfn) (const void*, const void*);没有 typedef 的情况下编写,那么comfn将是一个指向函数的指针,该函数返回int并接受两个类型的参数const void*

于 2013-07-22T08:13:19.727 回答
3

该声明为特定类型typedef创建别名。这意味着它可以用作声明和定义中的任何其他类型。

所以如果你有例如

typedef int (*compfn)(const void*, const void*);

compfn然后,您可以仅使用而不是整个函数指针声明来声明变量或参数。例如,这两个声明是相等的:

compfn function_pointer_1;
int (*function_pointer_2)(const void*, const void*);

两者都创建了一个函数指针变量,唯一的区别是变量名的名称。

当你有很长和/或复杂的声明时,使用typedef是很常见的,以方便你编写这样的声明并使其更容易阅读。

于 2013-07-22T08:16:22.577 回答
0

它是一种函数指针。指向的函数返回int并接受两个const void*参数。

于 2013-07-22T08:14:28.057 回答