c ++将地址位置视为整数

时间:2014-08-10 02:14:38

标签: c++ pointers pass-by-reference

我想知道是否有可以将变量的地址位置存储为整数值。 例如,假设我有一个数字存储在内存中的某个位置

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

这可能吗? 我怎么能做这个任务?

4 个答案:

答案 0 :(得分:10)

指针不是整数。如果要存储指针值,则几乎应始终将其存储在指针对象(变量)中。这是指针类型的用途。

可以使用强制转换将指针值转换为整数,或者是C风格的强制转换:

int foo;
int addr = (int)&foo;

或使用C ++风格的演员:

int foo;
int addr = reinterpret_cast<int>(&foo);

但这很少是有用的事情,它可能会丢失int恰好小于指针的系统的信息。

C提供了两个typedef intptr_tuintptr_t,它们保证能够保存转换的指针值而不会丢失信息。 (如果没有足够宽的整数类型,则不会定义intptr_tuintptr_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]。您可以在不同类型的指针之间进行类型转换,以更改偏移量“步长”。