在编程中遇到的各种指针形式

主要用来总结在编程中遇到的各种指针形式

一、普通的定义类型

这种形式就是最简单的定义形式

int a = 4;
或者是stm32中的
 uint8_t temp=1;

二、指针有关的各种定义与形式

2.1、最常见的一种形式

int *a = 4;

上面的定义中*a = 4中的

a表示这个变量的地址,

在地址前面加一个*符号则表示存在这个地址的那个变量。   

比如我定义了一个变量:

int *a = 4;

系统自动为这个变量分配了一个地址是0x11。则可以确定

a = 0x11
而在0x11这个地址中保存的变量是4
也就是*a=4

2.2、和数组有关的指针 

数组是一种比较特别的变量。数组名表示的就是地址。也就是说我定义一个数组:

int a[10];

这个a其实表示的是一个地址,也因为这个原因,就有了一下的关系:

图片来源:STM32——最好的指针详解_stm32 结构体指针-CSDN博客

这也就解释了,在stm32的串口通信函数中明明需要的传递是指针,但是在编程时却直接将数组名填入到了子函数中。

void uartWriteBuf(uint8_t *buf, uint8_t len)
{
		
	while (len--) {
		while ((USART1->SR & 0x40) == 0);
		//HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000);
		SendData(USART1,*buf++);
	}
}

上面uartWriteBuf()子函数的第一个变量是指针,但是在调用这个子函数时直接用的:

uint8_t LobotTxBuf[128];  //发送缓存

uartWriteBuf(LobotTxBuf ,10)

就是因为LobotTxBuf[128];是个数组,而数组名LobotTxBuf就是一个地址

2.3、和&有关的指针

在一个变量前面加上&表示保存这个变量的那个地址。

比如我定义了一个变量

int a=4;

系统在我定义这个变量时自动将这个变量保存在了0xf1的地址中

那么就会有:

&a=0xf1

然后再回头看上面的 uartWriteBuf()子函数,第一个变量是指针,如果我定义了一个变量

uint8_t buf=0x41(字母a的十六进制表示就是0x41)

这时候我将变量buf赋值给函数uartWriteBuf()就需要通过以下操作

uartWriteBuf(&buf ,1)

因为&buf才是地址,buf只是个变量

三、指针的运算

定义一个指针

uint8_t Buf[128];  

在编程中经常会遇到Buf++的这种操作,这其实是在对地址进行操作

图片来源:STM32——最好的指针详解_stm32 结构体指针-CSDN博客

这里的Buf++表示下移动一个数据宽度 ,但是不同类型的数据的数据宽度是不一样的,那也就表示,对于不同的数量类型,Buf++的移动位数也是不一样的

上面咱们定义了Buf是uint8_t类型,也就表示Buf数组是一个8位的数据类型,那么Buf++就加8位

比如Buf表示的地址是0x00也就是保存Buf[0]变量的那个地址是0x00

那么Buf++就是保存Buf[1]变量的那个地址,因为是8位的数据类型,所以保存Buf[1]变量的那个地址是0x08.

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值