首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中,当作为参数传递时,`&function`和`function`有什么区别?

在C中,当作为参数传递时,`&function`和`function`有什么区别?
EN

Stack Overflow用户
提问于 2011-06-09 21:19:25
回答 4查看 4.8K关注 0票数 21

例如:

代码语言:javascript
复制
#include <stdio.h>

typedef void (* proto_1)();
typedef void proto_2();

void my_function(int j){
    printf("hello from function. I got %d.\n",j);
}

void call_arg_1(proto_1 arg){
    arg(5);
}
void call_arg_2(proto_2 arg){
    arg(5);
}
void main(){
    call_arg_1(&my_function);
    call_arg_1(my_function);
    call_arg_2(&my_function);
    call_arg_2(my_function);
}

运行此命令,我会得到以下结果:

代码语言:javascript
复制
> tcc -run try.c
hello from function. I got 5.
hello from function. I got 5.
hello from function. I got 5.
hello from function. I got 5.

我的两个问题是:

  • 使用(* proto)定义的函数原型和没有定义的函数原型有什么区别?
  • 使用引用运算符(&)调用函数和不使用引用运算符调用函数有什么区别?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-09 21:32:26

这是没有区别的。有关证据,请参阅C99 specification (第6.7.5.3.8节)。

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

票数 23
EN

Stack Overflow用户

发布于 2011-06-09 21:20:50

作为论据传递时,&functionfunction之间没有区别

但是,您的typedefs之间存在差异。我不知道官方的解释,也就是说到底有什么不同,但根据我的记忆

代码语言:javascript
复制
typedef void (*name1)(void);

代码语言:javascript
复制
typedef void(name2)(void);

是不同的:

name1是指向不带参数且不返回任何内容的函数的指针

name2是一个不带参数且不返回任何内容的函数

你可以通过编译来测试它:

代码语言:javascript
复制
typedef void (*pointer)(void);
typedef void (function)(void);

void foo(void){}

int main()
{
    pointer p;
    function f;

    p = foo; //compiles
    p();

    f = foo; //does not compile
    f();
}

再说一次,我不适合解释这种行为的确切原因,但我相信,如果你看看标准,你会在某个地方找到解释。

票数 7
EN

Stack Overflow用户

发布于 2011-06-09 21:26:48

&function和function没有区别--它们都是地址。您可以通过同时输出这两个命令来查看:

代码语言:javascript
复制
function bar(); 

.... 
printf("addr bar is 0x%d\n", &bar);
printf("bar is 0x%d\n", bar);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6293403

复制
相关文章

相似问题

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