调用函数指针时,星号是否可选?

我无法在任何地方找到答案。 我刚看完K&R,看到他们调用这样的函数指针:

(*ptr)(arg1, arg2); 

然而,我清楚地记得看到有人像这样使用它们:

 ptr(arg1, arg2); 

但这可能是在C ++中。

  • 规则怎么样?
  • 它们在C和C ++上有区别吗?

TL; DR

C和C ++中的规则是相同的,两者之间没有区别。


C ++标准( n3797 )说什么?

5.2.2p1 函数调用 [expr.call]

函数调用是后缀表达式,后跟括号,其中包含可能的空的逗号分隔的initializer-clause列表,这些子句构成函数的参数。

后缀表达式应具有函数类型或指向函数类型的指针


C标准( n1570 )说什么?

6.3.2.1p4 左值,数组和函数指示符

函数指示符是具有函数类型的表达式。 除非它是sizeof运算符, _Alignof运算符或一元&运算符的操作数,否则将具有“函数返回类型 ”类型的函数指示符转换为具有“指向函数返回类型的指针”类型的表达式

6.5.2.2p1 函数调用

表示被调用函数的表达式应具有指向函数的类型指针,该函数返回void或返回除数组类型之外的完整对象类型。



结论?

如何表达规则在C ++和C之间有所不同。在C中,隐式函数到指针的转换总是在调用函数时适用,而C ++声明“后缀表达式”可以是指针,也可以是函数类型的变量。

然而; 你的问题是,如果通过指针调用函数的两种方式在C ++和C之间不同,答案是: 不, (1)(2)(3)之间没有区别 ,也没有区别这两种语言。

 (*fptr)(123); // (1) 

 fptr(123); // (2) 

 (***fptr)(123); // (3) 

注意 :请注意,在调用函数时, (*fptr) (...)fptr (...)之间没有区别,但在其他上下文中它们可能会有很大差异。

规则怎么样? 它们在C和C ++上有区别吗?

不可以。在这种情况下取​​消引用函数指针是不必要的,因为它是多余的。

但是,您可能仍希望使用星号符号来强调您通过函数指针调用函数。 这也可能是您post中代码段作者的原因。