C中的功能指针-地址运算符“不必要”

问题描述 投票:7回答:6

在C中使用qsort,我们传入一个比较函数,例如

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

qsort的原型需要一个int (* )(const void* , const void*),所以我们称呼:

qsort(..., cmp);

但致电同样有效:

qsort(..., &cmp);

这是我们在C ++中传递静态成员函数时必须要做的。 Kernighan&Ritchie(第二版,第5.11节“函数的指针” p119)指出:“由于[cmp]是已知的函数,因此&运算符不是必需的,就像在数组名之前不需要它一样。 “

其他人对此是否感到有些不舒服(特别是关于类型安全性?)>

在C中使用qsort,我们传入了一个比较函数,例如int cmp(常量无效*,常量无效*); qsort的原型需要一个int(*)(const void *,const void *),因此我们将其称为:qsort(...,cmp);但它是...

c++ c function-pointers
6个回答
8
投票

无论您是否感到不舒服,都不会改变C不被视为类型安全语言的事实。恰当的例子:


5
投票

嗯,答案是按值传递函数会产生函数指针,与按值传递数组会产生指向其第一个元素的指针的方式相同。一个说数组和函数“衰减”。仅在少数情况下不会发生衰减。例如sizeof(array)产生数组的大小,而不是它的第一个元素指针之一。 sizeof(function)无效(函数不是对象),您必须执行sizeof(&function)。其他场合对引用具有约束力:


4
投票

我怀疑您只会感到不舒服,因为您不习惯于像C所允许的那样“接近金属”编码。 C之所以不需要函数上的address-of运算符,是因为除了调用它们或传递它们之外,您实际上无法对函数做任何事情。


3
投票

这是语法细节。如果您不喜欢不使用&来表示函数指针,请始终使用它。如果您喜欢保存多余的按键并且在编码中不那么明确,则可以利用它。


1
投票

与其说是不舒服感,还不如说是对尚未生效的语法选项的厌恶。 cmp是指针,应始终这样对待,或者它是其他某种类型,恕我直言,这在语法上具有误导性。


1
投票

请注意,'解引用'(即调用)函数指针也是如此;您不必

© www.soinside.com 2019 - 2024. All rights reserved.