我知道人们已经回答了 volatile 是什么,而 (int *) 只是强制转换,但我不明白这个表达式背后到底是什么:volatile int *p = (int *)0x0
所以我们有一个指向 int 的指针 p,它的值显然可以意外更改。我们给它分配另一个指向内存地址 0 的指针?那么它是指向指针的指针还是我让它变得比它应该的更复杂?如果您能提供这样一个简单的草图,我将不胜感激,因为它可以帮助我理解。
最佳答案
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/