Rud*_*y01 6 c++ pointers pass-by-reference
我想知道是否有可以将变量的地址位置存储为整数值.例如,假设我在内存中的某个位置存储了一个数字
int i= 20;
Run Code Online (Sandbox Code Playgroud)
我们知道,例如,变量i的位置是0x77C79AB2.例如
int * ip = &i;
Run Code Online (Sandbox Code Playgroud)
所以我们知道ip = 0x77C79AB2.
但此时变量ip只是一个指针.但是我要说我现在想将地址位置0x77C79AB2存储到int类型的变量中(不是Pointer类型).
所以,不知何故,我希望能够创建另一个类型(int)的变量来实际存储数字0x77C79AB2作为一个值而不是一个地址位置.
int a = 0x77C79AB2;
Run Code Online (Sandbox Code Playgroud)
所以,我可以用变量a做任何我想做的事情.例如,我想将a视为一个整数,并为其添加十六进制数0x20.
例如
int b = a + 0x20 = 0x77C79AB2 + 0x20 = 0x77C79AD2
Run Code Online (Sandbox Code Playgroud)
这可能吗?我怎么能做这个任务?
Kei*_*son 13
指针不是整数.如果要存储指针值,则几乎应始终将其存储在指针对象(变量)中.这就是指针类型的用途.
您可以使用强制转换将指针值转换为整数,也可以是C样式转换:
int foo;
int addr = (int)&foo;
Run Code Online (Sandbox Code Playgroud)
或使用C++风格的演员:
int foo;
int addr = reinterpret_cast<int>(&foo);
Run Code Online (Sandbox Code Playgroud)
但这很少是一件有用的事情,它可能会丢失信息,而这些信息int恰好比指针小.
C提供2周的typedef intptr_t和uintptr_t被保证是能够在不丢失信息以保持转换后的指针值.(如果没有整数类型对于本足够宽,intptr_t并且uintptr_t将不被定义).这些是在<stdint.h>头文件或<cstdint>C++中声明的:
#include <stdint.h>
// ...
int foo;
uintptr_t addr = reinterpret_cast<uintptr_t>(&foo);
Run Code Online (Sandbox Code Playgroud)
然后,您可以对该值执行整数运算 - 但不能保证任何算术的结果都是有意义的.
我怀疑你正在尝试做一些没有多大意义的事情.在极少数情况下,将指针值转换为整数是有意义的,甚至在对结果执行算术有意义的情况下也是如此.阅读你的问题,我没有看到你真正需要这样做的真实迹象.你到底想要完成什么?无论你想做什么,都有可能做到更清洁.
问:有什么方法可以将变量的地址位置存储为整数值。
答:当然可以。您所要做的就是施放。
注意事项:
1) 只要记住所有平台上的 sizeof(int) != sizeof (char *) 即可。如上所述,尽可能使用“size_t”。
2) 对于C++,考虑使用reinterpret_cast<>: