为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

富国沪深 2019-02-14 15:11:24
p应该是一个函数指针,它所指向的函数的返回值为空void p已经是一个地址了,*(int*)&p看的晕乎乎的,不知道是什么意思 (int *)应该是个强制类型转换,把&p转成指向int的指针,p已经是地址了,&p地址的地址是什么?
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

#include <stdio.h>

void function1()
{
printf("bt!\n");
}

void (*p)();

void * Function()
{
void (*q)() = function1;
return q;
}

int main()
{
*(int*)&p=(int)Function();
p();
}

查看完整回答
反对 回复 2019-03-20
?
万千封印

TA贡献1891条经验 获得超3个赞

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()。



查看完整回答
反对 回复 2019-03-20
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

void (*p)();
*(int*)&p=(int)Function; /* 去掉括号 */
p();
实际上就是通过p调用了Function函数

查看完整回答
反对 回复 2019-03-20
  • 3 回答
  • 0 关注
  • 1135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信