Que*_*tin 36 c c++ function-pointers function-call dereference
我想不出函数调用中多个星号的任何实际用法:
void foo(int a, char b)
{
}
int main(void)
{
(**************foo)(45, 'c');
//or with pointer to function:
void (*ptr)(int, char) = foo;
(******ptr)(32, 'a');
}
Run Code Online (Sandbox Code Playgroud)
为什么在C和C++中都允许这个东西?
Mik*_*our 42
C和C++中的标准转换之一是函数到指针的转换; 当函数名出现在表达式中时,它可以转换为指向该函数的指针.所以:
foo 相当于 &foo*foo相当于*(&foo),或foo**foo是等价的**(&foo),或者*foo,或者foo等等.
这意味着您可以*在函数名称之前合法添加任意数量的内容而不更改其含义.但是,没有理由这样做.
cni*_*tar 39
为什么在C和C++中都允许这个东西?
我不能代表C++,但对于C,至少将函数指示符转换为指针:
6.3.2.1 - 4
甲功能标志是具有功能类型的表达式.除非它是sizeof运算符或一元&运算符的操作数,否则具有类型''函数返回类型''的函数指示符将转换为具有类型'' 指向函数返回类型 '的指针的表达式.
应用间接运算符会产生一个函数指示符:
6.5.3.2 - 3
一元*运算符表示间接.如果操作数指向函数,则结果是函数指示符
因此,无论您应用间接运算符多少次,您都会得到相同的东西:一个立即转换为指针的函数指示符.
在我看来,这样做很少或没有用.
因为*运营商需要一个地址值.每当一个值出现时(与一个对象或函数glvalue相反),rvalue的左值,指针和数组到指针转换的函数都应用于一个操作数.因此,当再次取消引用时,解除引用的函数立即再次转换为指针.
这些都是从对象读取值或产生分别引用数组或函数开头的指针值.
除了它的lulz之外,这些dereferences行没有任何目的.