在STM32嵌入式开发系列中,因为是C语言写代码为主,所以对于指针的使用十分的常用。例如在指导书中经常这么写:
// GPIOH 端口全部输出 高电平
2 *(unsigned int*)(0x4002 1C14) = 0xFFFF;
0x4002 1C14 在我们看来是 GPIOH 端口 ODR 的地址,但是在编译器看来,这只是一
个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,
把它转换成指针,即(unsigned int *)0x4002 1C14,然后再对这个指针进行 * 操作。
经过我查阅资料发现,这样理解指针会非常容易:
自我理解:对于指针而言,类似的,结构体指针也是一样的。所以理解的关键还是在于:每一层指针,都必须有实际指向的地址。所以,将上述的例子改写为:
unsigned int *p,data;
p=(unsigned int *)(0x4002 1C14);
*p=data;
对于指针p而言,定义的类型其实是:unsigned int *,而指针变量里面所存放的是地址,(0x4002 1C14)这个就是地址,但是考虑到指针p的类型,所以才会写成第二行的形式,所以只要记住* 是取data,&是取地址就可以了。最后,我们将这三行组合一下,不就是参考书的东西了吗?这就是个二重指针,不难
参考:http://blog.chinaunix.net/uid-29381996-id-4579359.html
https://zhidao.baidu.com/question/465849218.html
野火哥里面有很多类似 如下的
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
GPIO初始化函数,我们看一下这个初始化函数长啥样子:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
为啥能这么写呢?
是因为,形参是指针类型的,首先要干啥?tell me!
首先要指定地址,让他往哪里指,所以GPIO_Init这里面的全都是放的是地址。