主要用来总结在编程中遇到的各种指针形式
一、普通的定义类型
这种形式就是最简单的定义形式
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.