推荐答案
测试一下
题目
某寄存器的地址为addr,现在要求将此寄存器的值取反,下列正确的C语言描述是:
A (unsigned int **)(addr)= - (volatile unsigned int *)(addr)
B *(volatile unsigned int *)(addr)= - (*(volatile unsigned int *)(addr))
C (volatile unsigned int *)(addr)= - (*(volatile unsigned int *)(addr))
D (volatile unsigned int *)(addr)= - (volatile unsigned int *)(addr)
参考答案与知识点
参考答案
正确答案是B。C语言中访问硬件寄存器时,必须使用volatile关键字防止编译器优化,并通过解引用指针来读写。选项B的写法`*(volatile unsigned int *)(addr) = - (*(volatile unsigned int *)(addr))`语法正确:左侧通过类型转换将addr强制为指向volatile unsigned int的指针,然后解引用得到左值;右侧先解引用读取寄存器值,再取负后赋值。但题目中“取反”通常指按位取反(运算符~),而选项均使用算术取反运算符“-”,两者含义不同。然而从语法角度,只有B的左侧是合法的左值(解引用后的变量),右侧是合法表达式;A左侧为指针的指针,类型不匹配且不可写;C、D左侧为指针本身,不是左值,不能被赋值。因此B是唯一正确的语法描述。实际硬件编程中,取反应使用`~`运算符。
涉及知识点
- volatile关键字的作用
- 指针类型转换与解引用
- 左值的概念
- 寄存器访问的正确写法
- 按位取反与算术取反的区别