想象你是一个快递员,需要把一箱书从图书馆搬到教室。
假设你有一本4页的书(共4字节),需要存放在4个连续的书架上(内存地址)。
0x12, 0x34, 0x56, 0x78
→ 地址1→12,地址2→34,地址3→56,地址4→78。0x12, 0x34, 0x56, 0x78
→ 地址1→78,地址2→56,地址3→34,地址4→12。关键点:
unsigned int test = 0x1234;
if (*((unsigned char*)&test) == 0x34) {
printf("小端模式"); // 最后一页先放
} else {
printf("大端模式"); // 第一页先放
}
假设你有一本4页的书(unsigned long a = 0x12345678
),需要拆分成4个包裹邮寄。
// 手动拆分,像一页页撕下来装进包裹
Gu8BufferA[0] = a >> 24; // 取第1页
Gu8BufferA[1] = a >> 16; // 取第2页
Gu8BufferA[2] = a >> 8; // 取第3页
Gu8BufferA[3] = a; // 取第4页
问题:需要4行代码,容易出错,且依赖“大端”规则。
// 指针直接“打包”整本书到目标地址
unsigned long *pu32 = (unsigned long*)&Gu8BufferA[0];
*pu32 = a; // 1行代码完成拆分!
优势:自动适配大小端规则,代码简洁!
假设你收到4个包裹,内容是0x12, 0x34, 0x56, 0x78
,需要拼成一本完整的书。
// 手动拼装,像一页页粘回去
b = Gu8BufferB[0];
b = b << 8; b += Gu8BufferB[1];
b = b << 8; b += Gu8BufferB[2];
b = b << 8; b += Gu8BufferB[3];
问题:需要7行代码,依赖大小端规则,容易出错。
// 指针直接“读取”整本书
unsigned long *pu32 = (unsigned long*)&Gu8BufferB[0];
b = *pu32; // 1行代码完成重组!
优势:自动适配大小端规则,代码简洁!
unsigned long*
对应unsigned long
)。unsigned long
需4字节对齐)。#include
// 数据仓库(存储在ROM中)
unsigned long a = 0x12345678; // 需要拆分的大书
unsigned char Gu8BufferA[4]; // 拆分后的4个包裹
unsigned char Gu8BufferB[4] = {0x12,0x34,0x56,0x78}; // 接收的包裹
unsigned long b; // 拼装后的大书
unsigned long *pu32; // 指针导航员
void main() {
// 拆分大书(化整为零)
pu32 = (unsigned long*)&Gu8BufferA[0];
*pu32 = a; // 指针直接打包
// 拼装包裹(化零为整)
pu32 = (unsigned long*)&Gu8BufferB[0];
b = *pu32; // 指针直接读取
// 输出结果(假设View函数已实现)
View(Gu8BufferA[0]); // 输出第1个包裹:0x12
View(Gu8BufferA[1]); // 输出第2个包裹:0x34
View(Gu8BufferA[2]); // 输出第3个包裹:0x56
View(Gu8BufferA[3]); // 输出第4个包裹:0x78
View(b); // 输出重组后的书:0x12345678
while(1); // 循环等待
}
Q:大小端为什么重要?
A:就像快递包裹的包装方式不同,如果拆分和重组规则不一致,数据会像“错版书”一样无法阅读。
Q:指针会不会“迷路”?
A:如果指针指向错误的位置(比如空书架),程序会出错。必须确保指针正确绑定到数据地址。
Q:移位法和指针法哪个更好?
A:指针法更简洁且自动适配规则,但需注意一致性原则。移位法则更灵活,但代码复杂。
通过指针,你可以像导航员一样高效搬运数据,解决以下问题:
记住:指针是数据操作的“智能导航”,掌握它,你的代码会更简洁、高效!
附:数据转换流程图
graph LR
A[大书(0x12345678)] --> B[指针拆分 → 4个包裹]
B --> C[发送/存储包裹]
C --> D[指针重组 → 拼成大书]
D --> E[结果:0x12345678]