指针
寒假不能荒废,学起来
类型 * 指针名 牢记指针核心就是一个可变地址
*作用为取地址里的内容,仅用于取已定义好的指针变量或者数组(数组名的实质就是地址,确切的地址,而指针是“空地址“,他需要指向一个地址,所以在某种程度上,他两是等价的,如下面将指针当成数组用)
&作用为取地址
buf等价于&buf[0]
uint8_t buf[5]={1,3,5,7,9};
uint8_t *p_buf = buf;//定义指针指向buf/&buf[0]
*p_buf = ? //p_buf指向buf的首地址,*p_buf=1;
p_buf[0]=? //指针指向的地址偏移0个单位
p_buf[1]=?//指针指向的地址偏移1个单位
p_buf++; //指针指向下一个地址
*p_buf = ? //p_buf指向buf[1]地址:3
p_buf[0]=?//目前的指针指向的地址偏移0个单位,为3
注意:指针具有可变性,常见错误:
①指针溢出
②未申请内存就使用
如:
未分配内存
char *p_buf;
p_buf[0]=100;
uint8_t buf[5]={1,3,5,7,9};
uint8_t *p_buf = buf;
p_buf[5]=200;//越界使用,指针溢出
宏定义
作用:维护,核心是替换
标识符:宏定义的名字
字符串:常数,表达式,格式串
格式:#define 标识符 字符串
#define PI 3.14159
#define HSE_VALUE 8000000U
宏函数
define LED1(X) do{x?\
HAL_GPIO_WRITEPIN(LED1_GPIP_PORT,LED1_GPIO_PIN,GPIO_PIN_SET);\
HAL_GPIO_WRITEPIN(LED1_GPIP_PORT,LED1_GPIO_PIN,GPIO_PIN_RESET);\
}while(0)
使用do{…}while(0)构造后的宏定义不会受到大括号中括号等影响,总是会按照你期望的方式调用运行!
如果不用do{…}while(0),例如遇到
if(1)
LED1(1)
将等价于
if(1)
HAL_GPIO_WRITEPIN(LED1_GPIP_PORT,LED1_GPIO_PIN,GPIO_PIN_SET);\
HAL_GPIO_WRITEPIN(LED1_GPIP_PORT,LED1_GPIO_PIN,GPIO_PIN_RESET);\
这是错误的