1.用指针访问结构体的成员
有两种方法: ① 使用->运算符
首先love是一个结构变量:
struct book love = { .name ="C primer", .autor ="jack", .time = 50 };index = &love ,那么 index->name ,就相当于 love.name。
其中注意 运算符"->" 与"."的工作方式相同, 都是取出结构体中的一个成员,但是 "->"前面是指向结构体的指针
而 "." 前面是一个结构名!
② 使用"."
index = &love, (*index).name 。
这里是使能GPIOB 类I/O口时钟的寄存器操作指令,这里表明了RCC是一个指向结构体的指针,而在其头文件中有
#define RCC ((RCC_TypeDef *) RCC_BASE) 这里之前一直看不懂什么意思现在明白了,我们先找到对于RCC_TypeDef的定义: typedef struct { __IO uint32_t CR; __IO uint32_t CFGR; __IO uint32_t CIR; __IO uint32_t APB2RSTR; __IO uint32_t APB1RSTR; __IO uint32_t AHBENR; __IO uint32_t APB2ENR; __IO uint32_t APB1ENR; __IO uint32_t BDCR; __IO uint32_t CSR; #ifdef STM32F10X_CL __IO uint32_t AHBRSTR; __IO uint32_t CFGR2; #endif /* STM32F10X_CL */ #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) uint32_t RESERVED0; __IO uint32_t CFGR2; #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ } RCC_TypeDef;发现RCC_TypeDef是一个结构变量,对于结构变量我们其实可以把他理解为像int flot 这种的数据类型,只不过这种数据类型可以包括很多中(结构体中可以有 int char 各种类型的组合),那么现在我们再来看刚刚对于RCC的定义
#define RCC ((RCC_TypeDef *) RCC_BASE)(RCC_TyprDef*)其实就是一种数据类型加上* 相当于(int *)这种的强制转换,也就是说(RCC_TyprDef*)是将后面的RCC_BASE 强制转换为 RCC_TyprDef 这种数据结构的指针 并将其定义为RCC ,
在stm32中是知道寄存器的内存地址的,这个地址比如0x008000是一个整数,可是编译器只知道它是一个整数不知道它是寄存器的地址,所以通过这样一个强制转化,将相应RCC_BASE(寄存器地址)转化为RCC_TyprDef 这种数据结构的指针:
意思就是:把这个值RCC_BASE转化为一个地址,并且这个地址指向的内容是”RCC_TyprDef 这种数据结构“的值
所以定义这样一个指向寄存器的指针后 ,我们就可以使用运算符->来取其中相应寄存器的值进行操作