在没有'&'的情况下初始化一个函数指针。操作者

时间:2017-12-07 01:42:53

标签: c pointers function-pointers

我正在玩函数指针,遇到了一些直觉上不符合我对C中指针的理解的东西。

看看以下代码:

include <stdio.h>

void fun(int a) {
    printf("fun, %d!\n", a);

}

void bun(int b) {
    printf("bun, %d!\n", b);
}


int main(){

    void (*fooptr)(int) = &bun;
    void (*blooptr) (int) = fun;

    fooptr(200);
    blooptr(100);

    return 0;
}

如果我像C中的任何其他指针一样处理函数指针,我应该期望void (*blooptr) (int) = fun;触发针对不兼容类型的编译器警告。我的代码编译(静默)并按预期工作。

C如何让我在没有&运算符的情况下初始化函数指针,就像我会做一个常规指针一样,甚至没有编译器警告?这是否是我偶然得到正确行为的情况之一,尽管我在技术上处于未定义的行为领域?如果有人可以解释为什么这是有效的,并且对函数指针的本质有一些见解(对文献的参考),那就太棒了。

我试着四处寻找这个具体的问题,但找不到任何相关的问题。似乎有点基础,所以如果它是一个重复道歉。

1 个答案:

答案 0 :(得分:0)

C中的函数类型自动且隐式地衰减到函数指针类型(就像一元&运算符一样被应用)。除了一元&运算符和sizeof运算符之外,此衰减发生在所有上下文中。出于这个原因

void (*fooptr)(int) = &bun;

void (*fooptr)(int) = bun;

是另外两种说同样的方式。