function指针 – 自动解除引用

可能重复:
如何解除引用函数指针?

void myprint(char* x) { printf("%s\n", x); } int main() { char* s = "hello"; void (*test)(char*); void (*test2)(char*); test = myprint; test2 = &myprint; test(s); (*test)(s); test2(s); (*test2)(s); } 

任何人都可以向我解释为什么以上所有代码都有效? “你好”打印四次。 通过应用函数指针,它是否隐式解除了? 基本上我想知道函数指针是如何实际存储的,因为上面的内容有点令人困惑。

这只是C的一个怪癖。没有其他原因,但C标准只是说取消引用或获取函数的地址只是计算指向该函数的指针,并且取消引用函数指针只是计算回函数指针。

这种行为(因此显然)与一元&*运算符对正常变量的工作方式非常不同。

所以,

 test2 = myprint; test2 = &myprint; test2 = *myprint; test2 = **********myprint; 

所有只是做完全相同,给你一个指向myprint的函数指针

同样的,

 test2(s); (*test2)(s); (***********test2)(s); 

同样,调用存储在test2的函数指针。 因为C说它确实如此。