指针和地址求解释

2019-03-23 18:20发布

void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  
  switch (*(uint32_t*)&GPIOx)
  {
    case GPIOA_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
      break;.....
不明白switch行中GPIOx为什么要取址,GPIOx本来不就是地址么?
#define GPIOA    ((GPIO_TypeDef*)GPIOA_BASE)
求解释
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
okhxyyo
1楼-- · 2019-03-23 20:17
/ 不知道这么解释对不对,但是我个人是这么理解的。用一个例子来表示:GPIOX本身代表的是一个房子,而取他的指针则是说这个房子的地址,当然还要取里面存的值的话就相当如放在这个房子里面的东西了。
lcofjp
2楼-- · 2019-03-23 21:16
 精彩回答 2  元偷偷看……
zqjqq88
3楼-- · 2019-03-24 01:48
地址是没错,但是地址的类型不一样,一个是GPIO_TypeDef*的 一个是uint32_t*的,其内存模型是不一样的,下面的使用需要强制转换才能和下面的case里面的GPIOA_BASE的数据类型匹配!
ddong0
4楼-- · 2019-03-24 03:31
楼上说的有道理,GPIO_DeInit(GPIO_TypeDef * GPIOx)定义了GPIOx为指向一块连续的内存,但GPIOx本身指向这块内存的首地址,和case后的类型也是一致的。
ddong0
5楼-- · 2019-03-24 08:53
 精彩回答 2  元偷偷看……
lcofjp
6楼-- · 2019-03-24 10:32
ddong0 发表于 2016-2-2 11:18
GPIOx类型转换应该是switch((uint32_t*)*&GPIOx)这个才和下面类型一致,switch (*(uint32_t*)&GPIOx)
...

无论哪一种写法,都是脱裤子放屁。
你需要做的就是确定GPIOA_BASE的类型,然后强制转换一下相应的类型就够了。

一周热门 更多>