铸造指针?

Casting pointers?

如果我们将 32 位指针转换为 8 位会发生什么?

我假设例如我们有 0x8000 0000,如果我们转换为 8 位,新指针的值将为 0x00。我说得对吗?

指针就是指针,取决于平台。在 32 位 CPU 上,指针始终为 32 位。

void *temp = 0x8000000;
uint8_t *temp = 0x8000000;
uint16_t *temp = 0x8000000;

如果你投射指针,你会改变指向值的大小。

void *temp = 0x80000000;
uint8_t temp2 = *((char *)(temp)); // return a single char (8 bits) at 0x80000000
uint16_t temp3 = *((short *)(temp)); // return a single short (16 bits) at 0x80000000

在 x86 架构上 CPU 指针只是指向内存区域的整数。 我认为并且希望您真正要问的是,是否可以有一个指向整数的指针,然后将其转换为指向字符的指针。

您可以通过创建指向整数的指针并将其转换为更窄的类型(例如 char)然后递增它来查看整数的位。

基本上,如果要递增 char 指针,则只会在整数中向上移动一个字节。

好吧,实际上有些架构具有不同大小的不同指针。经典的 x86 将具有近指针和远指针。前者有 16 位,并且被限制在某个内存区域。该区域之外的任何用法都未定义。远指针由单个 32 位变量中的两个 16 位值(段:偏移量)组成。段部分指定了指针有效的内存区域,而偏移量实际上与近指针相同。

然而,那不是(现在)不是 C 标准的一部分,而是 architecture-specific 扩展。由于这些可能已被认为对平台至关重要,因此所有可用的工具链都支持它,但仍然没有标准。

对于您的指针,您应该 - 通常 - 永远不要 fiddle 使用指针,特别是永远不要将其转换为不能容纳指针所需的所有位的类型。如果出于某种原因必须将指针存储在整数变量中,请使用 uintptr_tintptr_t,它们在 C99 标准的 stdint.h 中定义。但是,它们是可选的,因此您的工具链可能不支持它们(例如 gcc 支持;不知道 Microsoft 是否已经有时间将此 header 添加到 VS)。

请记住,存储在 uintptr_t 中的值(例如)可能与直接转换为另一种整数类型的值不同(但据我所知,对于 ARM 来说就是这种情况)。

但是,如果您询问如何压缩指针值,您可以先将其转换为 unitptr_t,然后使用 well-known 算法(Huffman 等)之一压缩整数值.).