C 为什么不';您不需要将参数传递给qsort比较器函数吗?

C 为什么不';您不需要将参数传递给qsort比较器函数吗?,c,parameters,parameter-passing,void-pointers,qsort,C,Parameters,Parameter Passing,Void Pointers,Qsort,下面的代码取自 *qsort示例*/ #包括 #包括 int值[]={40,10,100,90,20,25}; 整数比较(常数无效*a,常数无效*b) { 返回(*(int*)a-*(int*)b); } int main() { int n; qsort(值,6,sizeof(int),比较); for(n=0;nqsort传递它要比较的数组中任何项目的地址。例如,&values[3]和&values[5] 由于它实际上不知道数组中项目的实际类型,因此它使用size参数来正确计算地址。例如,请

下面的代码取自

*qsort示例*/
#包括
#包括
int值[]={40,10,100,90,20,25};
整数比较(常数无效*a,常数无效*b)
{
返回(*(int*)a-*(int*)b);
}
int main()
{
int n;
qsort(值,6,sizeof(int),比较);

for(n=0;n
qsort
传递它要比较的数组中任何项目的地址。例如,
&values[3]
&values[5]


由于它实际上不知道数组中项目的实际类型,因此它使用
size
参数来正确计算地址。例如,请参阅此实现:

qsort
传递它要比较的数组中任何项目的地址。例如,
&values[3]
&values[5]


由于它实际上不知道数组中项目的实际类型,因此它使用
size
参数来正确计算地址。例如,请参阅此实现:

调用qsort时,您将传递一个指向函数的指针,这就是您不指定任何参数的原因


在qsort实现内部,从“values”数组中选择值并调用“compare”函数。这就是传递“a”和“b”的方式。

调用qsort时,传递的是指向函数的指针,这就是为什么不指定任何参数的原因


在qsort实现内部,从“values”数组中选择值并调用“compare”函数。这就是“a”和“b”的传递方式。

在此表达式的上下文中:

qsort (values, 6, sizeof(int), compare);
标识函数的子表达式
compare
将衰减为指向该函数的指针(而不是函数调用)。该代码实际上等效于:

qsort (values, 6, sizeof(int), &compare);
这与数组用作函数参数时发生的情况完全相同(您以前可能见过,也可能没有见过,但更常见的问题是):


在本表达式的上下文中:

qsort (values, 6, sizeof(int), compare);
标识函数的子表达式
compare
将衰减为指向该函数的指针(而不是函数调用)。该代码实际上等效于:

qsort (values, 6, sizeof(int), &compare);
这与数组用作函数参数时发生的情况完全相同(您以前可能见过,也可能没有见过,但更常见的问题是):


在函数调用中,编译器将函数转换为指向函数的指针。原因是,就像数组一样,函数不能真正按值传递,因此语言有特定的规则,可以在函数声明和on和调用。
typedef void function();void f(function f);
在声明中被转换为
typedef void function();
void f(function*f);`并且
f(myvoidfunction)
被转换为
f(&myvoidfunction)
在调用的地方。我不会用懒惰的方式来调用它;我会用一致的方式来调用它。
()
操作符(即函数调用操作符)将函数指针作为其操作数。除非你到处写
(&function)(…)
每次进行函数调用时,如果要将函数的地址用于非调用目的,则编写
&function
是不一致的。@R()
在第一个方面是正确的。另一方面,只有函数指针可以作为参数传递给另一个函数。也就是说,标准非常明确,您可以调用函数,但只能传递指向函数的指针。您喜欢一种语法还是另一种语法是不同的问题,但如果目标是一致性,则您可以应该传递
&func
。从哪里获得?C99 6.5.2.2读取(在约束条件下):“表示被调用函数80的表达式应具有类型指针,指向返回void或返回数组类型以外的对象类型的函数。”脚注80读取:“通常,这是转换作为函数指示符的标识符的结果,"也就是说,如果表达式只是一个函数名,它就会衰减成一个函数指针。因此,编写一个没有符号的函数指针只是一种懒惰的方式?在函数调用中,编译器将函数转换为指向函数的指针。原因是,就像数组一样,函数不能真正通过值传递,因此nguage具有在函数声明和调用中执行该转换的特定规则。
typedef void function();void f(function f);
被转换为
typedef void function();
void f(function*f);`在声明中,
f(myvoidfunction)
被转换为
f(&myvoidfunction)
在调用的地方。我不会用懒惰的方式来调用它;我会用一致的方式来调用它。
()
操作符(即函数调用操作符)将函数指针作为其操作数。除非你到处写
(&function)(…)
每次进行函数调用时,如果要将函数的地址用于非调用目的,则编写
&function
是不一致的。@R()在第一个方面是正确的。另一方面,只有函数指针可以作为参数传递给另一个函数。也就是说,标准非常明确,您可以调用函数,但只能传递指向函数的指针。您喜欢一种语法还是另一种语法是不同的问题,但如果目标是一致性,则您可以应该通过
&func
。你在哪里