在没有“&”运算符的情况下初始化函数指针

Initializing a function pointer without the '&' operator

我一直在玩函数指针,运行 直觉上不符合我对 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 如何让我在没有 & 运算符的情况下初始化函数指针,就像我会做一个常规指针一样,甚至没有编译器警告?这是我不小心得到正确行为的情况之一吗,尽管我在技术上处于 未定义行为 领域?如果有人可以解释 为什么 这有效,并且对函数指针的性质有一些洞察力(参考文献也可以),那就太好了。

我试着四处寻找这个具体问题,但找不到任何相关内容。看起来有点基础,如果是骗子,请见谅。

C 中的函数类型自动隐式地退化为函数指针类型(就像一元 & 运算符被安静地应用一样)。这种衰减发生在所有上下文中,一元 & 运算符和 sizeof 运算符除外。为此

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

void (*fooptr)(int) = bun;

有两种不同的表达方式。