c - 这个使用 volatile、指针和内存分配的复杂表达式在幕后做了什么?

标签 c pointers

我知道人们已经回答了 volatile 是什么,而 (int *) 只是强制转换,但我不明白这个表达式背后到底是什么:volatile int *p = (int *)0x0

所以我们有一个指向 int 的指针 p,它的值显然可以意外更改。我们给它分配另一个指向内存地址 0 的指针?那么它是指向指针的指针还是我让它变得比它应该的更复杂?如果您能提供这样一个简单的草图,我将不胜感激,因为它可以帮助我理解。

Sketch

最佳答案

volatile NULL 指针没有太多意义,因为没有人会取消引用它。

但是如果我让这个表达式更有意义(这是 STM32 微 Controller 的特定示例)

 volatile uint32_t *GPIOA_CRL = (volatile uint32_t *)0x40010800UL;

我将 volatile 指针 GPIO_CLR 声明为 uint32_t 对象。该赋值将由无符号长常量定义的该硬件寄存器的地址强制转换为指针类型。

0x40010800UL - 硬件寄存器地址

(volatile uint32_t *) - 将无符号长地址转换为指针

然后我可以设置或读取这个寄存器的值。

为什么我将这个指针定义为volatile?因为它可以被硬件改变,编译器不会知道。因此 volatile 将强制编译器在每次使用前(当我取消引用此指针时)读取此地址下的值存储,并在每次更改后存储它。否则,编译器可能会优化这些读取和写入,因为它在正常的程序执行路径中看不到它的影响。

关于c - 这个使用 volatile、指针和内存分配的复杂表达式在幕后做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52188403/

相关文章:

c++ - const 对象和成员指针的 const 正确性,构造函数漏洞

c++ - 变量引用以及指针如何与内存交互

c - 是否存在使用编译器指令宏的 itoa 替代方案

c - C 中的 HTTP 身份验证和文件发送

c - 发送 X11 单击事件不适用于某些窗口

C语法。复制字符串

c - 指向正确内存位置的指针

c - 输出正确的单词

c++ - C++/Qt 中变量的别名?

指向 map->second 的 C++ 指针不指向