gpt4 book ai didi

c - 为什么我们不能取消引用常量整数?

转载 作者:太空狗 更新时间:2023-10-29 15:44:58 25 4
gpt4 key购买 nike

为了在使用嵌入式系统时理解指针,我试图理解这段访问内存映射寄存器的代码中发生了什么:

uint32_t regval = *(uint32_t *)0x40048004U;

在我看来,没有类型转换意味着 regval 现在等于地址的内存内容。我想这应该足够了,但事实并非如此。但是,在对其进行类型转换时,您将其视为用于单个操作的指针,这似乎有点多余。

因此,您将 regval 视为指向 0x40048004U 内存内容的未知地址的内存内容?为什么需要类型转换?

最佳答案

我知道你在问为什么我们不能这样做:

uint32_t register_value = *0x40048004U;

(即“为什么我们不能取消引用常数整数?”)。

有几个答案:

  • C 的整数常量语法没有任何指针值注释,只有有符号/无符号/短/长值(使用 UL 等就足够了)。
  • 如果您可以执行*0x40048004U,则不会指示指针的数据类型——计算机打算从该地址读取多少字节?有签名吗?未签名? (记住,常量的类型与内存地址的类型有关,而不是它指向的值)
  • 因此,通过要求使用显式转换运算符 *(valueType*)0xDEADBEFF 意味着可以使用与转换非常量值相同的语法来指定类型 - 而无需引入一种新的单独语法,并且由于这种类型转换是静态操作,因此对运行时性能的影响为零。

关于c - 为什么我们不能取消引用常量整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45469370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com