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

时间:2011-06-09 13:19:25

标签: c function functional-programming operators

例如:

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

运行这个我得到以下内容:

> 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)定义的函数原型与没有定义的函数原型有什么区别?
  • 使用引用运算符(&)和不使用?
  • 调用函数有什么区别

4 个答案:

答案 0 :(得分:18)

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

“参数声明为''函数返回类型''应调整为''指针指向 函数返回类型'',如6.3.2.1。“

答案 1 :(得分:7)

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

但是你的typedef之间存在差异。我不知道官方的解释,即究竟是什么区别,但我记得

typedef void (*name1)(void);

typedef void(name2)(void);

是不同的:

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

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

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

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

再一次,我不是解释这种行为的确切原因的合适人选,但我相信如果你看一下标准,你会在某处找到解释

答案 2 :(得分:5)

&amp;功能和功能之间没有区别 - 它们都是地址。您可以通过打印它们来看到这一点:

function bar(); 

.... 
printf("addr bar is 0x%d\n", &bar);
printf("bar is 0x%d\n", bar);

答案 3 :(得分:2)

区别仅在于风格。使用函数指针时有相同的情况:

void func (void);

...

void(*func_ptr)(void) = func;

func_ptr();    // call func
(*func_ptr)(); // call func

printf("%d\n", ptr); 
printf("%d\n", *ptr);

有些人说(* func_ptr)()语法是首选,要明确函数调用是通过函数指针完成的。其他人认为带*的风格更清晰。

像往常一样,很可能没有科学研究证明任何一种形式都比另一种更好,所以只选择一种风格并坚持下去。