核能预警:我相信本文的C语言代码,除非是像我一样万里挑一的高手,否则你绝对没有见过!
函数的本质是一段可执行代码段。
函数名,则是指向这段代码段的首地址。
函数类型的基本格式:返回值 (
∗
\ast
∗p)(参数);
例1:第一种玩法,这段C语言代码肯定会让你的小伙伴们都惊呆了!
附例1代码:
//小问学编程
#include
void print()
{
printf("调用了print函数\n");
return;
}
int main()
{
((void (*)(void))0x00401340)();
return 0;
}
例2:类似的C语言代码
附例2代码:
//小问学编程
#include
int main()
{
int a=100;
printf("打印a:%d\n",*(int*)0x0061fefc);
return 0;
}
例3:用来解释例1和例2的C语言代码
附例3代码:
//小问学编程
#include
void print()
{
printf("调用了print函数\n");
return;
}
int main()
{
int a=100;
printf("第一次打印a:%d\n",a);
printf("a的地址是:%p\n",&a);
printf("第二次打印a:%d\n",*(int*)0x0061fefc);
printf("\n");
print();
printf("print的地址是:%p\n",print);
((void(*)(void))0x00401340)();
return 0;
}
所以,函数在内存中是有地址的,函数名对应着函数的首地址,既然有地址,就可以定义指针储存地址或更改指针的指向,存储函数(首)地址的指针,称为函数指针。
例4:多种玩法:只要掌握了函数类型的基本格式这个原理就可以写出下述可以正常运行的C语言代码。
运行结果:
附例4代码:
//小问学编程
#include
void print()
{
printf("调用了print函数\n");
return;
}
int main()
{
//void (*p)(void)函数类型的基本格式
//第一种玩法
((void (*)(void))0x00401340)();
//第二种玩法
void (*p1)(void)=print;
p1();
//第三种玩法(不推荐)
void (*p2)(void)=&print;
(*p2)();
//第四种玩法
typedef void (*PF)(void);
PF pf=print;
pf();
return 0;
}
标签:return,函数,int,void,C语言,printf,print,函数指针,惊呆
来源: https://blog.csdn.net/weixin_43297891/article/details/112060594