如何使指针指向两个或多个连续的单元格

pon*_*dev 5 c pointers

假设我有一个uint8_t指向数组中第三个元素的指针,{1,2,4,5} *p也是4.我怎样才能指向4和5,这样*p就是45.它是否可能?我目前正在进行类型转换.这就是我做的事情,例如,如果数据是我的数组{1,2,4,5},我想获得4和5.

uint8_t dummyAddress = data[2]; 
dummyAddress = *((uint16_t*) dummyAddress);
*p = *dummyAddress; 
Run Code Online (Sandbox Code Playgroud)

我的理解是p现在应该指向4和5,但我不是.相反,当我执行第二行时,我遇到了一个段错误.p是一个uint64_t * const.它可以获得一个字节,但是当将相同的逻辑应用于两个字节时,我没有把它弄好.

Wer*_*nze 4

你可以这样做:

uint8_t data[] = { 1, 2, 4, 5 };
uint8_t *p8 = &data[2];
uint16_t u16 = *(uint16_t*)p8;
Run Code Online (Sandbox Code Playgroud)

然后(uint16_t*)p8将指向data[2]data[3]。但您无法轻松访问*(uint16_t*)p8。首先,这是因为p8可能未在uint16_t边界上对齐。在这种情况下,某些处理器会导致异常。其次,即使您可以访问,*(uint16_t*)p8根据处理器的字节顺序(大端/小端),您也可能会得到不同的结果。您可能会得到 0x0405,也可能会得到 0x0504。

另请注意,在您的行中

dummyAddress = *((uint16_t*) dummyAddress);
Run Code Online (Sandbox Code Playgroud)

您首先将dummyAddress其重新解释为指向的指针uint16_t,然后取消引用它,因此返回 auint16_t并将其存储在dummyAddress. 这显然不是您想要做的。如果这确实可以编译,请考虑使用更高的警告级别进行编译,并查看每个编译器警告(只有当您理解它并确定它不是编程错误时才忽略它)。

顺便说一句,您将无法按照您在问题中请求的p位置获得指针。*p==45

另外,正如 mch 所说:严格的别名规则是什么?