C 铸造指针?

C 铸造指针?,c,memory,embedded,C,Memory,Embedded,如果我们将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

如果我们将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 arch CPU上,指针只是指向内存区域的整数。 我想,你们真正想问的,也是希望的是,是否可能有一个指向整数的指针,然后把它转换成指向字符的指针

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


基本上,如果你增加一个字符指针,你只会在整数中向上移动一个字节。

实际上,有些体系结构有不同大小的指针。经典的x86应该有近指针和远指针。前者有16位,仅限于某个存储区域。在此区域之外的任何使用都将是未定义的。远指针由两个16位值段组成:单个32位变量中的偏移量。段部分指定了指针有效的内存区域,而偏移量实际上与近指针相同

然而,这过去是,现在不是C标准的一部分,而是特定于体系结构的扩展。因为这些可能被认为是平台的关键,所以它得到了所有可用工具链的支持,但仍然没有任何标准

对于您的指针,一般来说,您应该永远不要摆弄指针,尤其是永远不要将其转换为无法容纳指针所需的所有位的类型。如果出于某种原因必须将指针存储在整数变量中,请使用从C99标准开始在stdint.h中定义的uintpttr___t或intptr___t。但是,它们是可选的,因此您的工具链可能不支持它们,因为gcc实例支持它们;不知道微软是否已经有时间将此标题添加到VS

请记住,例如,存储在uintptr_t中的值可能与直接转换到另一个整数类型不同,但对于ARM,我自己就知道这种情况


但是,如果您询问如何压缩指针值,您可能首先将其强制转换为unitptr_t,然后使用著名的算法之一Huffman等压缩整数值。我认为这取决于实现。8位指针是什么?或者你指的是指向8位数据类型的指针?我认为是字节数据类型。指针是指针,大小取决于平台。如果强制转换指针,指针值的大小会改变。是否可以强制转换指针,使其大小不同/更小?即使是这样,它似乎是多余的——指针不应该指向每个内存地址吗?我使用的是32位ARM Cortex-M3处理器。我只是感到困惑,如果将32位指针强制转换为8位,我们将从错误的地址读取,因为0x8000 0000和0x00指向不同的内存位置,ofc取决于内存映射。@Lazar,指向8位值的指针仍然是32/64位,您可以通过检查sizeof轻松确认这一点。例如sizeofint*、sizeofuint8_t*等。指针目标的大小与指针大小无关。@domen因此,例如uint8_t*数据表示指向8位值的32位指针?@Lazar,大部分正确,但它可能是64位的,甚至可能是其他的。正如我所写的,它取决于平台。对于64位paltform,指针将为64位宽。在您的例子中,Cortex-M3是32位。