已知 STM32F4的 GPIOA 的IDR 地址是 0x40020010
int n=*( (volatile long *) 0x40020010);
请问下 第一个指针 和 第2个volatile long *指针有什么区别?
(volatile long *) 改成(volatile int *) 效果一样。为什么?
我做了一个实验:
*(GPIO_TypeDef *)0x40000000 = 57.5d;
结果出错:
RTE qq.c(25):错误:#513:无法将类型“double”的值分配给类型为“GPIO_TypeDef”的实体
猜想:
57.5d是“double”类型
那么应该是先 *0x40000000 指向0x40000000这个地址, 再把57.5d 给(GPIO_TypeDef *)
int n=*( (volatile long *) 0x40020010);
那应该是先 *0x40020010 这个地址,取出 volatile long 类型给左值。不知对不对?
0x40020c14是GPIOA->ODR的地址。
*( (volatile long *) 0x40020c14)=0x0A;
* (char* )0x40020c14 = 0x01<<12;
GPIOA->ODR =0x01;
* (char* )0x40020c14 = 0xFFFF;//出现一个警告,不能把int类型给char类型,,,,溢出
*(int *)(0x40000000+0x200fff) = 0xffff;
地址我试了下可以把地址改成表达式。
我想问下二级指针是什么样子的?怎么用, 二级指针就是双指针吗?
有大神普及下吗?万分感谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1.
第一个指针 和 第2个volatile long *指针有什么区别?
第一个是取值,第二个是类型转换。类型转换的一个原因是骗过编译器。
*(GPIO_TypeDef *)0x40000000 = 57.5d;
这个编译器肯定不让你通过。
2.
long在这里就是 int ,当然没问题
3.
二级指针也没什么难度,原理跟普通指针一样,就是指针的指针。指针是存储地址的变量,那么指针的指针就是存储指针的变量。
理解指针,只需要理解内存就没什么难度了。还有三级四级指针,也一样。注意多维数组也只是类于一级指针。
4.
GPIOA->ODR怎么才能把每个bit分给16个bool类型,而且修改一个bool不能影响其他bool。
你说的这叫bit_band,位带,单片机有专门的区域有位膨胀 ;百度一下就OK ,CM3的手册里也有详细的说明。
一周热门 更多>