赞
踩
指针移位操作通常指对指针进行地址的偏移或移位,以便于访问连续的内存区域。
在C语言中,可以通过以下方式对指针进行移位操作:
int a[10] = {1, 2, ..., 10}; int *p = &a[0]; // 将指针p指向数组a的第一个元素 p += 3; // 将指针p向右移动3个位置在以上代码中,首先定义了一个整型数组a和一个指向其第一个元素的指针p。然后,将指针p向右移动3个位置,即将其指向a[3]位置的地址。这里使用了指针算术运算中的加法运算,由于指针p指向的数据类型是int类型,因此每次移动时应该增加4个字节的偏移量(或称大小)。
需要注意的是,在进行指针移位操作时,应该确保指针类型和指向的数据类型一致,并遵循C语言指针算术运算的规则。此外,还应该考虑指针越界和未定义行为等问题,以确保程序正常运行和可靠性。
需要注意的是,在进行指针移位操作时,应该确保指针类型和指向的数据类型一致,并遵循C语言指针算术运算的规则。此外,还应该考虑指针越界和未定义行为等问题,以确保程序正常运行和可靠性。
以下代码是STM32的SPI实验中有关页写自动换页函数代码,其中指针位移操作的应用代码部分为:pBuffer+=pageremain;//数组指针左移pageremain位
具体作用是在写入数据字节数超过写入地址那一页剩余的字节数时,首先将写入地址那一页剩余字节数写满,然后跳转到下一页。完成换页后,我们不能将需要写入的数据再从头开始写了,因为,在上一页我们已经将数据写入了一部分,再写的话,这一页数据会有一部分和上一页一样,所以只能接着我们写入的那部分数据的下一个字节开始写。因此,我们需要利用需要写入数据的数组的指针移位操作,将数组指针指到需要继续写的那一个字节的位置上。然后再继续进行页写操作。
举例说明:
首先我们需要知道一页可以写256个字节
为解说方便我们假设SPI FLASH内存只有两页(也就是256*2个字节,也就是所有地址0~511)
我们要写的数据有321个,并且将写入字节的首地址是121,此时第一页我们只能写入255-121+1=135个字节,那么还剩下321-135=186个字节只能写入第二页,在写入第二页时,我们肯定要从要写入数据的第136个字节开始写入,因此我们要将写入数据数组的指针进行移位操作,将数组指针移到第136个字节的地址上。然后继续进行第二页的写操作。
- //无检验写SPI FLASH
- //必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
- //具有自动换页功能
- //在指定地址开始写入指定长度的数据,但是要确保地址不越界!
- //pBuffer:数据存储区
- //WriteAddr:开始写入的地址(24bit)
- //NumByteToWrite:要写入的字节数(最大65535)
- //CHECK OK
- void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
- {
- u16 pageremain;
- pageremain=256-WriteAddr%256; //单页剩余的字节数
- if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256个字节
- while(1)
- {
- W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
- if(NumByteToWrite==pageremain)break;//写入结束了
- else //NumByteToWrite>pageremain
- {
- pBuffer+=pageremain;//数组指针左移pageremain位
- WriteAddr+=pageremain;
-
- NumByteToWrite-=pageremain; //减去已经写入了的字节数
- if(NumByteToWrite>256)pageremain=256; //一次可以写入256个字节
- else pageremain=NumByteToWrite; //不够256个字节了
- }
- };
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。