mdk中指针

2019-07-20 09:45发布

已知  STM32F4的  GPIOAIDR  地址是 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;
地址我试了下可以把地址改成表达式。




我想问下二级指针是什么样子的?怎么用, 二级指针就是双指针吗?
有大神普及下吗?万分感谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
林光华ing
2019-07-20 14:31

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的手册里也有详细的说明。

一周热门 更多>