【发布时间】:2016-05-19 23:37:33
【问题描述】:
假设地址0xCF800000可以写:
A) 说两个代码产生相同的结果是否正确?
int main( void )
{
volatile unsigned long *pt = (volatile unsigned long *) 0xCF800000;
*pt = 0x00000000;
}
和
int main( void )
{
(*(volatile unsigned long *) 0xCF800000) = 0x00000000;
}
B) 在第一个代码中,0xCF800000 之前的语句“(volatile unsigned long *)”是必要的还是冗余的?
C) 在第一个代码中有一个变量 pt,它有自己的地址,我在其中放置了一些内容:0xCF800000。通过取消对 pt 的引用,计算机将获取 pt (0xCF800000) 的内容,“定位”该地址,并将 0x00000000 分配给该位置。在第二个代码上,我无法准确理解它是如何工作的,因为没有变量。看起来信息 0xCF800000 是“无处”。
【问题讨论】:
-
注意:我认为不需要
volatile。给定地址的对象只被引用一次,所以无论如何都必须检索它。 -
这些问题来自求职面试吗?
-
啊哈哈哈。没有为什么? @wildplasser 确实! volatile 的存在只是因为在关于 GPIO 的课程中出现了这种疑问
-
顺便说一句:你不需要
*pt = 0x00000000;因为*pt = 0;也会这样做。闻起来像货物崇拜...额外:常量0xCF800000可能在没有演员或u后缀的情况下签名。 -
A) 是的。 B) 必要的。 C)您需要查看程序集以了解编译器如何实现您的代码。否则,您只需要信任互联网上的随机陌生人。
标签: c pointers memory-address