功能指针 - 自动解除引用

Sea*_*lan 23 c function-pointers

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

  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);

  }
Run Code Online (Sandbox Code Playgroud)

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

nos*_*nos 38

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

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

所以,

test2 = myprint;
test2 = &myprint;
test2 = *myprint;
test2 = **********myprint;
Run Code Online (Sandbox Code Playgroud)

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

同样的,

test2(s);
(*test2)(s);
(***********test2)(s);
Run Code Online (Sandbox Code Playgroud)

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