什么是uintptr_t数据类型

什么是uintptr_t,它可以用来做什么?

这是一个无符号的int,它能够存储一个指针。 这通常意味着它与指针的大小相同。

它在C ++ 11及更高版本的标准中定义。

想要一个可以容纳一个架构的指针类型的整数类型的一个常见的原因是对指针执行整数特定的操作,或者通过将指针的类型提供为整数“句柄”来模糊指针的类型。

编辑:请注意,史蒂夫·杰索普有一些非常有趣的额外的细节(我不会偷)在另一个答案在这里为你迂腐类型:)

首先,在提问时, uintptr_t不在C ++中。 它是在C99中的<stdint.h> ,作为一个可选类型。 许多C ++ 03编译器都提供这个文件。 它也在C ++ 11中,在<cstdint> ,它又是可选的,它是指定义的C99。

在C99中,它被定义为“一个无符号整数类型的属性,任何有效的指针,无效的可以转换为这种类型,然后转换回到void的指针,结果将比较等于原始指针”。

拿这个来表示它的意思。 它没有说大小的任何事情。

uintptr_t的大小可能与void*相同。 它可能更大。 尽管这样的C ++实现方法不正确,但可以想象它会更小。 例如在void*为32位的虚拟平台上,只有24位虚拟地址空间被使用,你可以有一个满足要求的24位uintptr_t 。 我不知道为什么实施会这样做,但标准允许。

这是一个无符号的整数类型,正好是一个指针的大小。 每当你需要用一个指针来做一些不寻常的事情时 – 比如把所有的位都反转(不要问为什么),把它uintptr_tuintptr_t ,然后把它作为一个普通的整数进行处理,然后退回去。

“什么是uintptr_t数据类型”部分已经有很多好的答案了。 我会试图解决“它可以用来做什么?” 部分在这个职位。

主要针对指针上的按位操作。 请记住,在C ++中,不能对指针执行按位操作。 由于原因,请参阅为什么你不能对C中的指针进行按位操作,有没有办法解决这个问题?

因此,为了对指针进行按位操作,需要将指针指向unitpr_t类型,然后执行按位操作。

下面是一个函数的例子,我只写了一个按位排除或2个指针来存储XOR链表,这样我们就可以像双向链表一样在两个方向上遍历,但是不会在每个节点中存储2个指针。

  template <typename T> T* xor_ptrs(T* t1, T* t2) { return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(t1)^reinterpret_cast<uintptr_t>(t2)); }