假设我有一个有效的指针p0
:
T a[10];
T* p0 = &a[0];
我知道我可以安全地往返这样做:
reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0)) == p0;
但是,做以下事情是否安全?
T* p1 = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0) + sizeof(T));
即。我可以确定没有UB和p1 == &a[1]
吗?
答案 0 :(得分:2)
这是实现定义的行为。您的编译器应该记录指针算术是否等效于指针的转换数值上的整数算术。现代计算机上的情况应该是这样的,并且平板电脑可能会出现问题。字节寻址存储空间;但它并不能保证在所有平台上都可以移植。
使用char*
而不是uintptr_t
可以移植,只要您保留在数组中并确保指针在转换回之前正确对齐T
。