为什么不能对C中的指针进行按位操作,有没有办法解决这个问题?
我读到你不能在指针上做bitmasks,为什么你不能对指针进行按位操作?
有没有办法达到同样的效果?
这同样适用于C ++吗?
你不能做按位指针操作的原因是因为标准说你做不到。 我认为标准之所以这样说是因为按位指针操作几乎普遍会导致未定义或(最好)实现定义的行为。 因此,除了简单的操作(如添加)之外,您无法做任何有用且便携的事情。
但你可以用铸造来解决它:
#include void *ptr1; // Find page start void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff)
至于C ++,只需使用reinterpret_cast
而不是C风格的强制转换。
这是不允许的,因为语义并没有很好地定义。 不过你当然可以做到。 只需uintptr_t
为uintptr_t
,执行操作然后转换回指针类型。 这也适用于C ++。
您不能在指针上使用按位运算符,因为标准对如何表示指针以及任何特定指针可以处理的值的范围提出了很少的要求。 所以没有定义在指针上使用这些运算符意味着什么。
然而,大多数机器上的大多数编译器都使用内存地址的明显映射作为指针的值。 而且大多数都会让你指向一个整数类型的指针。 然后,您可以对该值执行按位运算,甚至将其强制转换为指针。 但这不是严格的便携式或一般的明确定义。