Jim*_*mmy 204 c c++ function-pointers
为什么以下工作?
void foo() {
cout << "Foo to you too!\n";
};
int main() {
void (*p1_foo)() = foo;
void (*p2_foo)() = *foo;
void (*p3_foo)() = &foo;
void (*p4_foo)() = *&foo;
void (*p5_foo)() = &*foo;
void (*p6_foo)() = **foo;
void (*p7_foo)() = **********************foo;
(*p1_foo)();
(*p2_foo)();
(*p3_foo)();
(*p4_foo)();
(*p5_foo)();
(*p6_foo)();
(*p7_foo)();
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 210
有一些部分允许所有这些运算符组合以相同的方式工作.
所有这些工作的根本原因是函数(如foo)可以隐式转换为指向函数的指针.这就是为什么void (*p1_foo)() = foo;工作: foo被隐式转换为指向自身的指针,并指定指针p1_foo.
&当应用于函数时,一元会产生一个指向函数的指针,就像它在应用于对象时产生对象的地址一样.对于指向普通函数的指针,由于隐式的函数 - 函数 - 指针转换,它总是冗余的.无论如何,这就是为什么void (*p3_foo)() = &foo;有效.
*当应用于函数指针时,一元会产生指向函数,就像它在应用于指向对象的普通指针时产生指向对象一样.
这些规则可以合并.考虑你倒数第二个例子,**foo:
foo隐式转换为指向自身的指针,第一个*应用于该函数指针,foo再次产生该函数.*应用,再次产生函数foo.您可以根据需要添加任意数量的*s,结果始终相同.越*S,越多越好.
我们还可以考虑你的第五个例子&*foo:
foo隐式转换为指向自身的指针; 应用了一元*,foo再次屈服.&应用于foo,产生指向foo该变量的指针.该&只能施加虽然给一个函数,而不是已被转换到一个函数指针(一个功能,除非,当然,函数指针是一个变量,在这种情况下,结果是一个指针到一个-指针- to-a-function;例如,你可以添加到你的列表中void (**pp_foo)() = &p7_foo;).
这就是为什么&&foo不起作用: &foo不是一个功能; 它是一个函数指针,它是一个右值.但是,它&*&*&*&*&*&*foo会起作用,&******&foo因为在这两个表达式中,&它总是应用于函数而不是rvalue函数指针.
另请注意,您不需要使用一元*通过函数指针进行调用; 双方(*p1_foo)();并(p1_foo)();有同样的结果,再次因为函数到函数指针的转换.
我认为记住C只是底层机器的抽象也是有帮助的,这是抽象泄漏的地方之一.
从计算机的角度来看,函数只是一个存储器地址,如果执行,则执行其他指令.因此,C中的函数本身被建模为地址,这可能导致函数与其指向的地址"相同"的设计.