【发布时间】:2018-01-10 04:23:15
【问题描述】:
为了在使用嵌入式系统时理解指针,我试图了解在访问内存映射寄存器的这段代码中发生了什么:
uint32_t regval = *(uint32_t *)0x40048004U;
在我看来,没有类型转换意味着 regval 现在等于地址的内存内容。我想这应该足够了,但事实并非如此。但是在类型转换时,您将其视为单个操作的指针,这似乎有点多余。
所以您将 regval 视为指向 0x40048004U 内存内容的未知地址的内存内容?为什么类型转换甚至是必要的?
【问题讨论】:
-
这不是多余的。
0x40048004U的类型是整数,而不是指针。请记住,类型定义了您可以或不能对值执行的操作。 -
因为
0x40048004U是一个文字或常量unsigned int。 C 不允许使用文字指针。请注意,这种强制转换是静态操作,因此不会影响运行时性能。 -
这些是很好的答案,伙计们,谢谢。我实际上没想到会有这么快的反应,而且我正在 atm 工作,所以以后必须再过一遍。非常感谢您的时间和洞察力。
-
与问题无关,代码不正确。读取硬件寄存器时,必须始终使用
*(volatile uint32_t *)0x40048004U;。否则编译器可能会进行非常奇怪的优化,程序可能无法按预期运行。
标签: c pointers types casting embedded