首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指向函数参数还是函数参数的指针?

指向函数参数还是函数参数的指针?
EN

Stack Overflow用户
提问于 2014-05-24 01:27:44
回答 3查看 592关注 0票数 10

我想了解以下两个声明( f1f2 )之间的区别:在f1中,我将参数声明为指向void()类型函数的指针,f2声明与f1有何不同?这些声明是否等同?在main中,我可以使用prototype void ()的函数来调用它们。我理解传递值/指针/引用的概念,但是这些都是函数,并不真正理解其中的区别。我不能“修改”在f1中作为参数传递的函数.谢谢!

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

代码语言:javascript
运行
复制
#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);
}

程序编译,输出是

代码语言:javascript
运行
复制
Invoking f1(g1())
Invoking f2(g2())
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-24 01:34:19

他们是等价物。您会对参数的隐式指针转换感到困惑。

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

这和数组一样--你也不能把数组作为函数参数传递,所以每当你把一个函数参数声明为一个数组时,它就会悄悄地变成一个指针。

票数 7
EN

Stack Overflow用户

发布于 2014-05-24 01:34:47

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

C99,第6.7.5.3/8节

将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如6.3.2.1所示。

C++11,第8.3.5/5节

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

因此,例如,在C++中,我们可以将f1f2的类型写成void(void(*)())

票数 13
EN

Stack Overflow用户

发布于 2014-05-24 01:34:30

它们是完全相同的另一种语法。在这两种情况下,都会传递函数指针,但您可以在参数列表中使用非指针语法。函数名的使用总是指向指向函数的指针(这种情况可以递归发生)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23840421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档