我想知道是否有可以将变量的地址位置存储为整数值。 例如,假设我有一个数字存储在内存中的某个位置
int i= 20;
我们知道,例如,变量i的位置是0x77C79AB2。 例如
int * ip = &i;
所以我们知道ip = 0x77C79AB2。
但此时变量ip只是一个指针。但是我要说我现在想将地址位置0x77C79AB2存储到int类型的变量中(不是Pointer类型)。
所以,不知怎的,我希望能够创建另一个类型(int)的变量来实际存储数字0x77C79AB2作为一个值而不是地址位置。
int a = 0x77C79AB2;
所以,我可以用变量a做任何我想做的事情。例如,我想将a视为一个整数,并向其添加十六进制数0x20。
e.g。
int b = a + 0x20 = 0x77C79AB2 + 0x20 = 0x77C79AD2
这可能吗? 我怎么能做这个任务?
答案 0 :(得分:10)
指针不是整数。如果要存储指针值,则几乎应始终将其存储在指针对象(变量)中。这是指针类型的用途。
你可以使用强制转换将指针值转换为整数,或者是C风格的强制转换:
int foo;
int addr = (int)&foo;
或使用C ++风格的演员:
int foo;
int addr = reinterpret_cast<int>(&foo);
但这很少是有用的事情,它可能会丢失int
恰好小于指针的系统的信息。
C提供了两个typedef intptr_t
和uintptr_t
,它们保证能够保存转换的指针值而不会丢失信息。 (如果没有足够宽的整数类型,则不会定义intptr_t
和uintptr_t
。这些在<stdint.h>
标题中声明,或在C ++中声明<cstdint>
:
#include <stdint.h>
// ...
int foo;
uintptr_t addr = reinterpret_cast<uintptr_t>(&foo);
然后,您可以对该值执行整数运算 - 但不保证任何算术的结果都是有意义的。
我怀疑你正在尝试做一些没有多大意义的事情。在极少数情况下,将指针值转换为整数是有意义的,甚至在对结果执行算术有意义的情况下也是如此。阅读你的问题,我没有看到你真正需要这样做的真实迹象。你到底想要完成什么?很可能无论你想做什么,都可以采用更清洁的方式。
答案 1 :(得分:3)
问:有什么办法可以将变量的地址位置存储为积分值。
答:好的。所有你需要做的就是演员。
注意事项:
1)请记住所有平台上的sizeof(int)!= sizeof(char *)。如上所述,使用&#34; size_t&#34;只要有可能。
2)对于C ++,请考虑使用reinterpret_cast&lt;&gt;:
答案 2 :(得分:2)
标头cstdint
定义了一个类型uintptr_t
,它是一个足以容纳指针的整数类型。使用reinterpret_cast将指针类型转换为它。 e.g:
#include <cstdint>
...
int i = 20;
uintptr_t ip = reinterpret_cast<uintptr_t>(&i);
答案 3 :(得分:1)
你可以通过回到数组语法来添加偏移量:ip [0x20]。您可以在不同类型的指针之间进行类型转换,以更改偏移量“步长”。