理解空*反对intptr_t和uintptr_t
Understanding void* against intptr_t and uintptr_t
这是我正在测试的代码:
int value = 0;
void* addyvoid = static_cast<void*>(&value); // C++-style cast.
它工作得很好,但我可以使用uintptr_t
/intptr_t
.但是它们并不像人们在这里所说的那样适合持有指针,因为它们太大了。那么,这是真的吗?但是,如果是,使用void*
来保存指针会更好,但是会丢失数据吗?
intptr_t
和uintptr_t
的目的是,在某些应用程序中,您确实需要对指针值进行某种数值计算,也许通过翻转单个位,也许通过对它们进行 XOR 等。在这些情况下,当您需要使用指针的数值时,intptr_t
和uintptr_t
是整数类型(如果存在),保证它们足够大以容纳任何指针。这不适用于int
,因为int
相对于指针大小的大小没有指定。
由于执行这些转换从根本上是不安全的,因此C++要求您使用reinterpret_cast
来与intptr_t
、uintptr_t
和指针类型进行转换。
如果您所做的只是存储"指向某物的指针",并且该指针不是函数指针或成员函数指针,则可以将其强制转换为void*
。该强制转换保证工作,从void*
转换回原始类型只需要static_cast
,并保证安全。
intptr_t
和uintptr_t
的大小并不是避免它们的好理由。它们只是用于不同的应用程序。如果需要对指针进行数值计算,请使用这些类型。否则,如果您只需要存储"指向某物的指针",请使用void*
。
相关文章:
- 我无法从 C# 获取 PInvoke 的输入参数以C++ DLL 以用作 IntPtr 的输出
- C++到 C# 转换与 IntPtr
- CreateCompatibleDC(IntPtr.Zero) returns IntPtr.Zero
- 如何让 IntPtr 成为本机 directx11 结构?
- 使用安全模式从DLL(通过(INTPTR)参数传递到该函数)获取char **
- 初始化 C# IntPtr 以接受来自非托管 C++ DLL 的数据?
- C#P/Invoke:将INTPTR的枚举值传递到功能;AccessViolationException
- 如何处理从C#中的C DLL返回的INTPTR
- typedef int* intptr OR typedef int *intptr;
- 我们可以将所有"int"参数和返回类型替换为 DllImport 方法签名中的"IntPtr"吗?
- const int*& vs typedef int* IntPtr
- HANDLE(IntPtr)已过时,kernel32.dll,安全文件句柄到IntPtr
- IntPtr大小问题
- c++ to VB.Net IntPtr Strings
- ComPtr<ID3D11Device> to IntPtr
- 如何在 C# 中获取 IntPtr 指针的属性
- 如何将 void* 放入 COM 变体中,以便它被 COM-Interop 编组为 IntPtr,到 .NET
- WP8:如何在 c++ 中找回 IntPtr
- 将 IntPtr 转换为对象 C#
- 无法使用 Marshal.PtrToStringAuto(IntPtr) 将 C++ char[] 封送到 C# 字符串