【发布时间】:2017-12-07 01:42:52
【问题描述】:
我在玩函数指针,但遇到了一些直觉上不符合我对 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 保留不一致、令人困惑的权利,并且只需要一个地址运算符'有时':(
标签: c pointers function-pointers