为什么以下工作?
void foo() {
cout << "Foo to you too!\n";
};
int main() {
void (*p1_foo)() = foo;
void (*p2_foo)() = *foo;
void (*p3_foo)() = &foo;
void (*p4_foo)() = *&foo;
void (*p5_foo)() = &*foo;
void (*p6_foo)() = **foo;
void (*p7_foo)() = **********************foo;
(*p1_foo)();
(*p2_foo)();
(*p3_foo)();
(*p4_foo)();
(*p5_foo)();
(*p6_foo)();
(*p7_foo)();
}
Run Code Online (Sandbox Code Playgroud) 为什么以及如何解除引用函数指针只是"什么都不做"?
这就是我所说的:
#include<stdio.h>
void hello() { printf("hello"); }
int main(void) {
(*****hello)();
}
Run Code Online (Sandbox Code Playgroud)
来自这里的评论:
函数指针解除引用就好了,但生成的函数指示符会立即转换回函数指针
从这里的答案:
解除引用(以你认为的方式)函数的指针意味着:访问CODE内存,因为它将是一个DATA内存.
不应该以这种方式取消引用函数指针.相反,它被称为.
我会使用"dereference"这个名字与"call"并排使用.没关系.
无论如何:C的设计方式是函数名称标识符和变量保持函数的指针都是相同的:地址到CODE内存.它允许通过在标识符或变量上使用call()语法来跳转到该内存.
如何准确地不提领一个函数指针的工作?
我无法在任何地方找到答案.我刚读了K&R,看到他们调用这样的函数指针:
(*ptr)(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)
然而,我清楚地记得看到有人像这样使用它们:
ptr(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)
但这可能是在C++中.