void (*p)(); *(int*)&p=(int)Function(); 什么意识?

p应该是一个函数指针,它所指向的函数的返回值为空void 
p已经是一个地址了,*(int*)&p看的晕乎乎的,不知道是什么意思 
(int *)应该是个强制类型转换,把&p转成指向int的指针,p已经是地址了,&p地址的地址是什么?

富国沪深
浏览 1072回答 3
3回答

慕桂英3389331

#include <stdio.h>void function1(){printf("bt!\n");}void (*p)();void * Function(){void (*q)() = function1;return q;}int main(){*(int*)&p=(int)Function();p();}

万千封印

Function()是干什么?执行Function函数,该函数的返回值是什么?天知道!但是(int)将函数执行的结果转换为了整形。我们先抛开p的原始类型不谈,看表达式*(int*)&p,首先将变量p的首地址转换为整型指针,然后对其求其指向的内容,最后的结果就是将p变量首地址开始的存储空间被视为一个int整数。后面的代码就是把一个int整数写入到p的首地址开始的一个int型变量应该占用的空间内。然后再看p,p是函数指针变量,最后的结果就是Function()执行后的结果,被存放到了p变量开始的一个int整型的空间内。我们考虑指针和整型的空间大小一样,如果Function()的返回是一个函数指针,那这里就没有信息丢失和转换。最后p()调用函数。这个转换过程的结果就是,不管Function返回的是什么,都把这个返回值做为一个“void (*p)()”类型的函数来对待,并调用这个函数。注意Function()函数的指针是Function,而不是Function()。

呼啦一阵风

void (*p)();*(int*)&p=(int)Function; /* 去掉括号 */p();实际上就是通过p调用了Function函数
打开App,查看更多内容
随时随地看视频慕课网APP