打印
[应用相关]

指针和地址求解释

[复制链接]
854|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lefeng|  楼主 | 2017-3-29 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
gp, GPIO, IO, pi, se
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)
求解释
沙发
lwsn| | 2017-3-29 21:10 | 只看该作者
用一个例子来表示:GPIOX本身代表的是一个房子,而取他的指针则是说这个房子的地址,当然还要取里面存的值的话就相当如放在这个房子里面的东西了。

使用特权

评论回复
板凳
豆腐块| | 2017-3-29 21:22 | 只看该作者
楼主不要随便拿来一段代码就学习或者参考,要学习好的代码才有意义,其实那一堆迷惑人的符号,完全没啥意义,为啥不这样写?:
switch ((uint32_t)GPIOx)

使用特权

评论回复
地板
可可球| | 2017-3-29 21:31 | 只看该作者
地址是没错,但是地址的类型不一样,一个是GPIO_TypeDef*的 一个是uint32_t*的,其内存模型是不一样的,下面的使用需要强制转换才能和下面的case里面的GPIOA_BASE的数据类型匹配!

使用特权

评论回复
5
Levenburg| | 2017-3-29 21:49 | 只看该作者
楼上说的有道理,GPIO_DeInit(GPIO_TypeDef * GPIOx)定义了GPIOx为指向一块连续的内存,但GPIOx本身指向这块内存的首地址,和case后的类型也是一致的。

使用特权

评论回复
6
Thorald| | 2017-3-29 22:00 | 只看该作者
GPIOx类型转换应该是switch((uint32_t*)*&GPIOx)这个才和下面类型一致,switch (*(uint32_t*)&GPIOx)
这样不是把GPIOx的地址转换成uint32_t类型了么?

使用特权

评论回复
7
戈卫东| | 2017-3-30 06:15 | 只看该作者
很丑陋很笨重的搞法啊。
我反对ST库的原因之一啊。(其实我不用ST库的主要原因是自己懒。。。。。懒得去看它)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

1087

帖子

0

粉丝