gpt4 book ai didi

c++ - 为什么函数指针定义可以使用任意数量的与号 '&' 或星号 '*' ?

转载 作者:行者123 更新时间:2023-11-30 16:18:46 24 4
gpt4 key购买 nike

为什么要进行以下工作?

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)();
}

最佳答案

有几个部分可以让所有这些运算符组合以相同的方式工作。

所有这些工作的根本原因是函数(如 foo )可以隐式转换为指向该函数的指针。这就是为什么void (*p1_foo)() = foo;作品:foo隐式转换为指向自身的指针,并将该指针分配给 p1_foo .

一元 &应用于函数时,会生成指向该函数的指针,就像应用于对象时生成对象的地址一样。对于指向普通函数的指针,由于隐式函数到函数指针的转换,它总是多余的。无论如何,这就是为什么void (*p3_foo)() = &foo;有效。

一元 * ,当应用于函数指针时,会产生指向的函数,就像它应用于指向对象的普通指针时产生指向的对象一样。

这些规则可以组合。考虑倒数第二个示例,**foo :

  • 首先,foo隐式转换为指向自身的指针,第一个 *应用于该函数指针,产生函数 foo再次。
  • 然后,结果再次隐式转换为指向自身和第二个 * 的指针。应用,再次产生函数 foo .
  • 然后再次隐式转换为函数指针并分配给变量。

您可以添加任意数量 *只要你喜欢,结果总是一样的。更多* s,越快乐。

我们还可以考虑您的第五个示例,&*foo :

  • 首先,foo隐式转换为指向自身的指针;一元 *应用,产生 foo再次。
  • 然后,&应用于foo ,产生一个指向 foo 的指针,它被分配给变量。

&但只能应用于函数,不能应用于已转换为函数指针的函数(当然,除非函数指针是变量,在这种情况下,结果是指向指针的指针-a-function;例如,您可以添加到列表中 void (**pp_foo)() = &p7_foo; )。

这就是为什么&&foo不起作用:&foo不是一个函数;它是一个函数指针,也是一个右值。然而,&*&*&*&*&*&*foo会起作用,就像&******&foo一样,因为在这两个表达式中 &始终应用于函数而不是右值函数指针。

另请注意,您不需要使用一元 *通过函数指针进行调用;两者(*p1_foo)();(p1_foo)();由于函数到函数指针的转换,具有相同的结果。

关于c++ - 为什么函数指针定义可以使用任意数量的与号 '&' 或星号 '*' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55813715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com