指向函数参数与函数参数的指针?

vso*_*tco 10 c++ pointers

我想了解的是什么2点声明之间的区别,f1以及f2,如下所示:在f1我宣布参数是一个指针类型的函数void(),是如何f2从不同的声明f1?声明是否相同?在main我可以用样机的功能调用两者void ().我理解传递值/指针/引用的概念,但这些是函数,并没有真正理解它们的区别.它不像我可以"修改"作为参数传递的函数f1...谢谢!

PS:当碰到众所周知的最令人烦恼的解析问题时,我遇到了这个问题:)

#include <iostream>

using namespace std;

void f1(void (*x)())
{
    x();
}

void f2(void x())
{
    x();
}

void g1()
{
    cout << "Invoking f1(g1())" << endl;
}

void g2()
{
    cout << "Invoking f2(g2())" << endl;
}


int main() 
{
    f1(g1);
    f2(g2);
}
Run Code Online (Sandbox Code Playgroud)

程序编译,输出是

Invoking f1(g1())
Invoking f2(g2())
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 13

在C和C++中,如果声明函数参数具有函数类型,则其类型将调整为函数指针.

C99,§6.7.5.3/ 8

参数声明为''函数返回类型''应调整为''指向函数返回类型'的指针,如6.3.2.1所述.

C++ 11,§8.3.5/ 5

...在确定每个参数的类型之后,将"T的数组"或"返回的函数T"的任何参数分别调整为"指向T的指针"或"指向函数返回T的指针",...

因此,在C++中,我们可以编写两者的类型f1f2as void(void(*)()).


Chr*_*odd 7

他们是等同的.你对参数发生的隐式指针转换感到困惑.

由于您不能将函数作为参数传递给函数(除了调用它们或获取其地址之外,您不能对C中的函数执行任何操作),编译器会将参数静默地更改为指向函数的指针.

这与数组发生的情况大致相同 - 您也无法将数组作为函数参数传递,因此每当您将函数参数声明为数组时,它都会以静默方式更改为指针.