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);
}
有人可以向我解释为什么以上所有代码都有效吗? “你好”打印四次。通过应用函数指针,它是否隐式解除了?基本上我想知道函数指针是如何实际存储的,因为上面的内容有点令人困惑。
答案 0 :(得分:32)
这只是C的一个怪癖。没有其他原因,但C标准只是说取消引用或取一个函数的地址只是评估指向该函数的指针,并且取消引用一个函数指针只是评估回函数指针。
这种行为(显然)与一元&
和*
运算符对正常变量的工作方式非常不同。
所以,
test2 = myprint;
test2 = &myprint;
test2 = *myprint;
test2 = **********myprint;
所有只是做同样的事情,给你一个指向myprint
同样,
test2(s);
(*test2)(s);
(***********test2)(s);
同样,调用存储在test2
中的函数指针。因为C说它确实如此。