我一直在使用一些在 ARM 处理器中运行的示例代码。要读取特定的内存位置,它会将常量值转换为地址。
例如:
我们要读取 0xa0000000 处的内存值
示例代码是这样的:
uint32_t test_data;
const uint32_t test_address = 0xa0000000;
test_data = *(uint32_t*) test_address;
我不太了解演员表 *(uint32_t*)。在我看来,只有一个 * 就足够了。
我会很感激一些解释。
谢谢。
您将指针存储为 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;
}
强制转换(uint32_t*) test_address将值重新解释test_address为地址,并产生一个指向该地址的指针。这种 C-cast 具有与 a 相同的效果reinterpret_cast- 实际上,reinterpret_cast应该使用它。
要获得指针所指向的值,即它的指针对象,有必要通过取消引用它*。这给了我们* ((uint32_t*) test_address),或者等价*(uint32_t*) test_address的。
如果你分开它会更清楚
test_data = *(uint32_t*) test_address;
分为两步
uint32_t *p = (uint32_t*) test_address;
test_data = *p;
第一个是演员表,第二个是取消引用