C/C++指针技巧(将指针保存到int,并转换回)
C/C++ pointer tricks (saving pointer to int, and translating back)
正如标题所说,我目前正在用C++中的指针进行一些小技巧,但有些东西不起作用:
uintptr_t texture_pointer = (int)((void*) &texture);
其中纹理是一个类;这似乎很好,因为我得到了一个指针值,并且我已经保证我在我的另一个函数中得到了相同的值,这个函数应该会把对象拿回来;这是失败的代码:
std::cout << "C++ BEFORE: " << texture_pointer << std::endl;
Texture texture = *(Texture*)((void*) texture_pointer);
std::cout << "C++ AFTER: " << (uintptr_t)((void*) &texture) << std::endl;
我的输出除外;是同一个数字,但我得到了两个不同的数字,因此我认为一定有错误,但我似乎找不到。
示例输出:
C++ BEFORE: 2685236
C++ AFTER: 2684960
此行:
Texture texture = *(Texture*)((void*) texture_pointer);
创建一个新Texture
对象作为原始对象的副本。显然,这与旧的地址不同。
你可以这样做:
Texture &texture = *(Texture*)((void*) texture_pointer);
(即创建一个对旧引用的引用(。
但总的来说,像这样的指针太麻烦了。
对于到void指针和从void指针进行强制转换,请使用static_cast
。对于向整数转换和从整数转换,请使用reinterpret_cast
:
SomeType* p;
// Make sure the type can hold a pointer.
std::uint64_t i = reinterpret_cast<std::uint64_t>(p);
...
SomeType* q = reinterpret_cast<SomeType*>(i); // Guaranteed to yield p back
除了其他答案中已经指出的错误外,这一行是不正确的,很可能在64位系统(LP64(上失败:
uintptr_t texture_pointer = (int)((void*) &texture);
应该是:
uintptr_t texture_pointer = (uintptr_t)&texture;
(假设出于某种原因,您希望使用C样式的强制转换,而不是正确的C++强制转换(。
最初,您获取在堆栈上而不是堆上分配的对象的地址。线路:
Texture texture = *(Texture*)((void*) texture_pointer);
然后将该对象复制到堆栈上分配的另一个对象中。然后你取第二个地址的地址。
当您处理两个不同的对象时,您有两个不同地址。
如果我正确计算了'*,则此行
Texture texture = *(Texture*)((void*) texture_pointer);
创建每个texture_pointer指向的内容的副本。
因此,texture和*texture_pointer是不同的存储位置,这就是为什么&texture和texture_pointer具有不同的值。
Texture texture = *(Texture*)((void*) texture_pointer);
这一行创建了一个新对象,并将texture_pointer指向的对象分配给它。这与创建指针并使其指向对象不同。当您将一个对象分配给另一个对象时,基本上就是将旧对象的内容复制到新对象中。因此,这两个打印的地址是不同的是有道理的——它们是两个不同对象的地址。
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 指针问题:从不兼容的类型"int"分配给"int *"
- 运行时错误:引用绑定到类型为"int"的空指针
- C++:将值 int(例如:0x00AAFAD8)转换为指针(指针本身也是 0x00AAFAD8 值)
- 如何将 int 指针转换为浮点指针
- 使用 int 指针的浮点数的位表示形式
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 从类指针到 int 的转换无效
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 为什么当我尝试将char输入到int时,文件指针会卡住
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 双指针 (int**) 和双括号,用于从 2D 数组中获取值
- (C++)通过指针递增,或者:为什么这不起作用?指针->int = 指针->int+1;
- (c++)将int转换为char指针(int是int形式的字符)
- 如何使用指针到指针 (int **) 分配一维数组
- 删除地图中的指针<int,A*>
- 如何将字符串内存地址(如 "7fefe05a8")存储在 C++ 中的指针/int 变量中,以便我可以对其进行位屏蔽?
- 指向包含向量问题的实例类的指针<int>