C语言复习之指针、宏定义

指针

寒假不能荒废,学起来
类型 * 指针名 牢记指针核心就是一个可变地址
*作用为取地址里的内容,仅用于取已定义好的指针变量或者数组(数组名的实质就是地址,确切的地址,而指针是“空地址“,他需要指向一个地址,所以在某种程度上,他两是等价的,如下面将指针当成数组用)
&作用为取地址

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);\

这是错误的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风月ac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值