0

我一直在使用一些在 ARM 处理器中运行的示例代码。要读取特定的内存位置,它会将常量值转换为地址。

例如:

我们要读取 0xa0000000 处的内存值

示例代码是这样的:

uint32_t test_data;

const uint32_t test_address = 0xa0000000;

test_data = *(uint32_t*) test_address;

我不太了解演员表 *(uint32_t*)。在我看来,只有一个 * 就足够了。

我会很感激一些解释。

谢谢。

4

3 回答 3

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;
}
于 2015-01-09T21:25:20.820 回答
1

强制转换(uint32_t*) test_address将值重新解释test_address为地址,并产生一个指向该地址的指针。这种 C-cast 具有与 a 相同的效果reinterpret_cast- 实际上,reinterpret_cast应该使用它。

要获得指针所指向的值,即它的指针对象,有必要通过取消引用它*。这给了我们* ((uint32_t*) test_address),或者等价*(uint32_t*) test_address的。

于 2015-01-09T21:24:53.663 回答
0

如果你分开它会更清楚

test_data = *(uint32_t*) test_address;

分为两步

uint32_t  *p = (uint32_t*) test_address;
test_data = *p;

第一个是演员表,第二个是取消引用

于 2015-01-09T21:31:45.177 回答