首页 > 解决方案 > 寻址指针中的方括号是什么?

问题描述

我一直在寻找地址指针中的方括号是什么,但我继续没有理解它。以下是函数的行,其中“id”变量是一个 uint32_t 指针,之前已作为参数传递。

#define LIST_STARTED (0x0001) /*defined out of the function*/
#define LIST_FIRST   (0x0002) /*defined out of the function*/

uint32_t *pointer = id;
uint16_t *flags = &((uint16_t *)pointer)[0];
uint16_t *index = &((uint16_t *)pointer)[1];
bool started = *flags & LIST_STARTED;
bool first   = *flags & LIST_FIRST;

if (!started){
    /* does something */
    *flags = MSEC_PRM_MGMT_LIST_STARTED;
    return true;
}
if (!first){
    /* does something */
    *flags |= MSEC_PRM_MGMT_LIST_FIRST;
    *index = 1;
    return true;
}
if (*index == final_index)
    /* does something */
    return false;

*index += 1;

我理解函数的逻辑是什么,但我不明白以下几行是做什么的。我将“所有”代码放在上面以防万一。

uint16_t *flags = &((uint16_t *)pointer)[0];
uint16_t *index = &((uint16_t *)pointer)[1];

如果有人可以帮助我,我将不胜感激!谢谢!

我编辑说这个 C 代码在嵌入式系统中运行良好,我没有修改它,我只是在观察它的行为。

标签: cpointersembeddedmemory-addressflags

解决方案


以下代码尝试将对象读取uint32_t为两个对象的数组uint16_t

uint32_t *id = ...;
uint32_t *pointer = id;
uint16_t *flags = &((uint16_t *)pointer)[0];
uint16_t *index = &((uint16_t *)pointer)[1];

通过和指针将对象读取uint32_t为 2个对象是未定义的行为,因为这违反了严格的别名规则。uint16_tflagsindex

正确的方法是:

uint16_t flags = *id; // The lowest order bits of id.
uint16_t index = *id >> 16; // The highest order bits of id.

在上述对 的分配中uint32_tuint16_t它会截断 的最高位id


推荐阅读