我一直在使用一些在ARM处理器中运行的示例代码。要读取特定的内存位置,它会向地址转换一个常量值。
例如:
我们想要读取0xa0000000
的内存值示例代码如下:
uint32_t test_data;
const uint32_t test_address = 0xa0000000;
test_data = *(uint32_t*) test_address;
我不太了解演员*(uint32_t *)。在我看来,只有一个*就足够了。
我很感激一些解释。
感谢。
答案 0 :(得分:2)
您将指针存储为uint32_t而不是指向uint32_t的指针。这就是你必须进行额外演员表的原因。
我建议如下:
#include <iostream>
int main(int argc, const char** argv) {
volatile uint32_t* const test_address = reinterpret_cast<uint32_t*>(0xa0000000);
uint32_t value = *test_address;
return 0;
}
答案 1 :(得分:1)
强制转换(uint32_t*) test_address
将test_address
的值重新解释为地址,并生成指向该地址的指针。这个C-cast与reinterpret_cast
具有相同的效果 - 实际上,应该使用reinterpret_cast
。
要获取指针指向的值,即其指针,必须通过*
取消引用它。这为我们提供了* ((uint32_t*) test_address)
,或等同于*(uint32_t*) test_address
。
答案 2 :(得分:0)
test_data = *(uint32_t*) test_address;
分为两步
uint32_t *p = (uint32_t*) test_address;
test_data = *p;
第一个是演员,第二个是解除引用