-
(*(void(*)())0)();
void(*)() // 这就是一个没有名字的函数指针 *(void(*)())0 // 这里可以看成 *(xx)0 的形式,其中 () 是类型转换符 // 所以这里的执行顺序应该是 *( (void(*)())0 ) // 所以这里是将数字 0 转换为函数的指针类型 // 及这个没有名字的函数指针指向一个地址为 0 的函数 (*(void(*)())0)(); // 调用这个首地址为 0 的函数。 // 综上:可以理解为在地址为0的内存放了一个没有返回值,没有参数的函数, // 这个语句就是调用这个函数。
其实直接写
((void(*)())0)();
也可以正确执行;#include <stdio.h> void fun(void) { printf("HelloWorld!\n"); } int main(void) { (*(void(*)())&fun)(); // 这里用fun函数的地址代替 0 地址 ((void(*)())fun)(); // 结果完全正确!! return 0; }
-
(*(char**(*)(char**,char**))0)(char**,char**);
同理,这个可以理解为内存为 0 的地址放了一个返回值为
char**
,有两个参数(char**, char**)
的函数,而这个语句就是调用这个函数。理论上语句前还应该有一个char**
的变量接收这个返回值的。 -
#include <stdio.h> #if 1 // 1 编译正确, 0 编译出错 typedef void (*pFunTyp) (void); // 这里定义了一个类型,而不是一个变量 pFunTyp pFun; // 所以这里必须再通过类型定义一个变量 #else typedef void (*pFun) (void); // 这里是直接定义了一个函数指针变量 #endif void fun(void) { printf("HelloWorld!\n"); } int main(int argc, char *argv[]) { pFun = fun; // 这里的两种赋值方式都可以 // pFun = &fun; pFun(); // 以及这两种调用方式也能正确执行 (*pFun)(); return 0; }