C/C++关于void*存储int变量的问题

在C/C++中,有时候会遇到将int值存储在void*这种类型中,比如在一个通用实现的链表节点中,数据区data是void*,

而我们只需要存储int时,该如何处理最简单呢?

一般来说,void*是一个指针,它指向一块内存地址,对于32位机器void*是32位的,对于64位机器,void*是64位大小的,

那么如何将int存储到void*中呢。

我们再来思考一下,void*指向一块内存地址,假设定义如下变量:

void * p

那么p实际上是一个32位或者64位大小的整型值!

在我们以int方式输出p时,如printf("%d\n", (int)p),输出的就是内存地址的整型值。

既如此,有变量int a=0x123,可以做如下转换:

p = (void*)a

此时p指向内存地址为a,不过这个地址并不存在,而且我们也不需要存在,因为我们只关心p的值。

也因此p可以存储一个int值。

可以定义如下宏便于转换:

#define INT_TO_POINTER(i) ((void*) (long) (i))

#define POINTER_TO_INT(p) ((int)  (long) (p))

int在有些平台可能是16位,这里中间加了一个long是因为long在所有平台至少是32位,指针类型也是至少是32位,这样处理对于编译器而言更加安全。

转载请注明出处!谢谢。

算法公众号:acm-clan





  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值