STM32-详解C语言数组指针比较字符串原理
代码原理解析
这段代码实现了一个名为 Buffercmp 的函数,用于比较两个 uint32_t 类型数组(通过指针操作)的内容是否相等,核心逻辑基于指针遍历和逐元素比较 :
- 函数参数: const uint32_t* pBuffer:指向第一个待比较数据缓冲区的指针,const 修饰表明在函数内不会通过该指针修改其指向的数据,保证数据源的只读性。 uint32_t* pBuffer1:指向第二个待比较数据缓冲区的指针,可通过该指针遍历数据。 uint16_t BufferLength:表示要比较的数据元素个数,决定循环执行次数。
- 循环逻辑:while(BufferLength--) 是一个先判断再自减的循环,每次循环先检查 BufferLength 是否大于 0(执行判断后 BufferLength 的值会减 1 ),只要大于 0 就执行循环体内容。
- 比较操作:if(*pBuffer != *pBuffer1) 解引用两个指针,获取它们当前指向的 uint32_t 类型数据并比较。若不相等,函数返回 FAILED,表示两个缓冲区内容不一致;若相等,继续执行后续指针移动操作。
- 指针移动:pBuffer++ 和 pBuffer1++ 使两个指针分别向后移动一个 uint32_t 类型数据的长度(因指针类型是 uint32_t* ,移动步长由类型决定,通常为 4 字节,具体取决于系统环境 ),指向下一个要比较的数据元素,为下一轮循环做准备。
- 返回结果:当循环正常结束(即所有 BufferLength 个元素都比较完毕且都相等 ),函数返回 PASSED,表示两个缓冲区内容一致。
应用方法
应用场景
- 数据校验:在通信协议处理中,接收端收到数据后,可与本地存储的预期数据缓冲区用该函数比较,判断数据传输是否出错(如串口通信、网络 socket 数据接收校验 )。
- 内存数据一致性检查:系统中不同模块共享数据或对同一数据做不同处理后,用此函数对比处理前后或不同模块缓存的数据是否一致,排查逻辑错误。
- 测试用例验证:编写单元测试时,将函数处理后的输出数据缓冲区与预期结果缓冲区比较,验证函数功能是否正确。
使用示例(以简单的裸机环境或嵌入式工程为例,假设相关类型和返回值已定义 )
c
运行
// 假设已定义相关类型和返回值
typedef enum {
FAILED = 0,
PASSED = 1
} TestStatus;
#include <stdint.h>
#include <stdio.h>
TestStatus Buffercmp(const uint32_t* pBuffer, uint32_t* pBuffer1, uint16_t BufferLength) {
while(BufferLength--) {
if(*pBuffer != *pBuffer1) {
return FAILED;
}
pBuffer++;
pBuffer1++;
}
return PASSED;
}
int main() {
uint32_t buffer1[] = {1, 2, 3, 4};
uint32_t buffer2[] = {1, 2, 3, 4};
uint32_t buffer3[] = {1, 2, 4, 4};
uint16_t len = 4;
TestStatus result1 = Buffercmp(buffer1, buffer2, len);
if (result1 == PASSED) {
printf("buffer1 and buffer2 are the same.\n");
} else {
printf("buffer1 and buffer2 are different.\n");
}
TestStatus result2 = Buffercmp(buffer1, buffer3, len);
if (result2 == PASSED) {
printf("buffer1 and buffer3 are the same.\n");
} else {
printf("buffer1 and buffer3 are different.\n");
}
return 0;
}
在上述示例中:
- 先定义了 TestStatus 枚举类型表示比较结果。
- main 函数里创建了三个 uint32_t 数组,调用 Buffercmp 函数分别比较 buffer1 与 buffer2、buffer1 与 buffer3 的内容,根据返回结果打印对应的比较结论 。
- 指针移动 P++ 先移动指针指向的数据,再使用*P 指向指针的数据获取数据