首页 > 试题广场 >

如下哪一段代码不能给地址0xaae0275c赋值为1?()

[单选题]
如下哪一段代码不能给地址0xaae0275c赋值为1?()
  • volatile int *p = (int *)0xaae0275c;*p = 1
  • (volatile int *)0xaae0275c[0] = 1
  • volatile int *p = (int *)0xaae0275c;p[0] = 1
  • *(volatile int *)0xaae0275c = 1
推荐
主要考察赋值到指定的内存地址
选项A,C, 通过一个指针向其指向的内存地址写入数据。
选项D,这行代码其实和上面的两行代码没有本质的区别。先将地址0xaae0275c强制转换,告诉编译器这个地址上将存储一个int类型的数据;然后通过钥匙“*”向这块内存写入一个数据。
选项B,将一个右值赋给一个左值,显然行不通。类似指针,int *p; p=1不合理
另外这里涉及到volatile关键字,顺便介绍一下
(1)用来同步,因为同一个东西可能在不同的存储介质中有多个副本,有些情况下会使得这些副本中的值不同,这是不允许的,所以干脆用volatile,让它只 有一个,没有其他的副本,这样就不会发生不同步的问题。
(2)防止编译器优化去掉某些语句,像我在arm中见到个寄存器非常奇怪,当中断来的时候,相对应的位置1,而清0又不能向这位写0,向这位写1才是1才 是清中断(清0),
// 假设0x560012300 为寄存器地址
#define INTPAND *(volatile unsigned int *)0x560012300
INTPAND = INTPAND; // 清中断
像编译器如果看到有INTPAND = INTPAND;这种看似无用的操作,如果没有volatile说明,编译器就很有可能会去掉INTPAND = INTPAND;实际上有用的东 西,却被编译器当没用的东西优化掉了。
(3)当地址是io端口的时候,读写这个地址是不能对它进行缓存的,这是相对于某些嵌入式中有***才有这个。比如写这个io端口的时候,如果没有这个 volatile,很可能由于编译器的优化,会先把值先写到一个缓冲区,到一定时候 再写到io端口,这样就不能使数据及时的写到io端口,有了volatile说明以后, 就不会再经过***,write buffer这种,而是直接写到io端口,从而避免了读写 io端口的延时。
编辑于 2016-04-25 14:28:32 回复(4)
选项B不对的原因,还是运算符优先级的问题。
(volatile int *)0xaae0275c[0]=1 的意思是,先取出0xaae0275c地址处的值,然后把该值强制转换成int*类型,显然,该值是一个数值,不是变量,是右值,向该值再赋值1,就类似于 2=1; 这样的赋值,显然不对。
想改正确很容易,加上括号就OK了。
正确方式如下:
((volatile int *)0xaae0275c)[0]=1;
加上一对括号即可。

发表于 2015-12-14 11:40:42 回复(5)
对于B来说
[]运算符优先级较高,所以先0xaae0275c[0]取出这个地址的值,然后将值强制转换成int* 指针,
最后相当于int *p;p = 1,显然是行不通的
发表于 2016-07-24 11:07:17 回复(2)
运算符优先级看晕了
只记得[]和() 是同一优先级 然后忘记这个不是() 而是强制类型转移的运算符了
优先级低于[] 
发表于 2016-08-30 21:46:58 回复(0)
B选项中,[] 运算符优先级是最高的。所以,0xaae0275c[0]是取这个地址的值,而0xaae0275c是右值(常量)而非变量,所以这个操作错误。
发表于 2018-02-19 15:07:15 回复(0)
[]优先级最高。[]要求数组或指针类型,而0xaae0275c既不是数组也不是指针。
发表于 2017-06-12 09:02:55 回复(0)
可以将地址当作一个指针q,(volatile int *)看作是声明一个指针变量q。所以只有*(volatile int *)q 才是取地址指向的内容。
发表于 2021-09-15 21:37:40 回复(0)
优先级问题,以及出现右值向左值赋值的错误
发表于 2017-03-23 12:16:34 回复(0)
[]优先级最高
发表于 2017-02-23 07:49:09 回复(0)
去vs编译器试了下,直接就是不允许这样操作
编辑于 2024-01-02 20:18:16 回复(0)
此处()是强制类型转换运算符,优先级低于[]。
发表于 2023-08-11 08:46:01 回复(0)
长姿势了,单个对象指针访问内存变量还可以p[0]=i来赋值
发表于 2021-03-28 01:12:52 回复(0)
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。
发表于 2018-02-28 10:00:45 回复(0)
向指定的内存地址写入值,正规的应该使用,mmap()映射函数!!
发表于 2016-12-01 21:09:05 回复(0)
B
发表于 2015-11-23 08:40:04 回复(0)