c - 寻址指针中的方括号是什么?
问题描述
我一直在寻找地址指针中的方括号是什么,但我继续没有理解它。以下是函数的行,其中“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 代码在嵌入式系统中运行良好,我没有修改它,我只是在观察它的行为。
解决方案
以下代码尝试将对象读取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_t
flags
index
正确的方法是:
uint16_t flags = *id; // The lowest order bits of id.
uint16_t index = *id >> 16; // The highest order bits of id.
在上述对 的分配中uint32_t
,uint16_t
它会截断 的最高位id
。
推荐阅读
- android - 在项目“:app”中找不到任务“installDebug”。- 在反应原生
- azure - 运行 az vm 命令需要哪些权限?
- loops - 为什么我的函数不会按预期循环?
- java - @Transactional 注解覆盖了 Mockito 的 InjectMocks
- django - 在两个模型字段范围内搜索日期范围
- javascript - 使用ajax动态加载模态细节
- python - 我可以让机器人全局检查返回有用的值而不是布尔值吗?
- css - “开始”:“sass./sass/style.scss style.css --watch”
- upgrade - 问题将magento版本从2.3.3升级到2.4.0
- android - 为什么我在 View Model 中的 observable 仅在第二次调用后才发出值