从单片机基础到程序框架(全集 2019pdf版).pdf - 第305页
其它 部分的 代码 不要动 。编 译后 ,把程 序下 载进带 串口 的 51 学 习板, 通过 电脑 端的串 口助 手软件 就可 以观 察到不同的 变量数值,详 细方法请看第 十一节 内容。

void main() //主函数
{
GtMould.u8Data_A=1; //依靠成员的“名字”来“调用”
GtMould.u16Data_B=2; //依靠成员的“名字”来“调用”
GtMould.u32Data_C=3; //依靠成员的“名字”来“调用”
View(GtMould.u8Data_A); //把结构体成员 GtMould.u8Data_A 发送到电脑端观察
View(GtMould.u16Data_B); //把结构体成员 GtMould.u16Data_B 发送到电脑端观察
View(GtMould.u32Data_C); //把结构体成员 GtMould.u32Data_C 发送到电脑端观察
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:1
十六进制:1
二进制:1
第 2 个数
十进制:2
十六进制:2
二进制:10
第 3 个数
十进制:3
十六进制:3
二进制:11
分析:
GtMould.u8Data_A 为 1。
GtMould.u16Data_B 为 2。
GtMould.u32Data_C 为 3。
【70.4 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第七十一节: 结构体的内存和赋值。
【71.1 结构体的内存生效。】
上一节讲到结构体有三道标准工序“造模”和“生成”和“调用”,那么,结构体在哪道工序的时候才
会开始占用内存(或者说内存生效)?答案是在第二道工序“生成”(或者说定义)的时候才产生内存开销。
第一道工序仅“造模”不“生成”是不会产生内存的。什么意思呢?请看下面的例子。
第一种情况:仅“造模”不“生成”。
struct StructMould //“造模”
{
unsigned char u8Data_A;
unsigned char u8Data_B;
};
分析:这种情况是没有内存开销的,尽管你已经写下了数行代码,但是 C 编译器在翻译此代码的时候,
它会识别到你偷工减料仅仅“造模”而不“生成”新变量,此时 C 编译器会把你这段代码忽略而过。
第二种情况:先“造模”再“生成”。
struct StructMould //“造模”
{
unsigned char u8Data_A;
unsigned char u8Data_B;
};
struct StructMould GtMould_1; //“生成”一个变量 GtMould_1。占用 2 个字节内存
struct StructMould GtMould_2; //“生成”一个变量 GtMould_2。占用 2 个字节内存
分析:这种情况才会占用内存。你“生成”变量越多,占用的内存就越大。像本例子,“生成”了两个
变量 GtMould_1 和 GtMould_2,一个变量占用 2 个字节,两个就一共占用了 4 个字节。结论:内存的占用是
跟变量的“生成”有关。
【71.2 结构体的内存对齐。】
什么是对齐?为了确保内存的地址能整除某个“对齐倍数”(比如 4)。比如以 4 为“对齐倍数”,在地址
0 存放一个变量 a,因为地址 0 能整除“对齐倍数”4,所以符合“地址对齐”,接着往下再存放第二个变量 b,
紧接着的地址 1 不能整除“对齐倍数”4,此时,为了内存对齐,本来打算把变量 b 放到地址 1 的,现在就
要更改挪到地址 4 才符合“地址对齐”,这就是内存对齐的含义。“对齐倍数”是什么?“对齐倍数”就是单
片机的位数除以 8。比如 8 位单片机的“对齐倍数”是 1(8 除以 8),16 位单片机是 2(16 除以 8),32 位单
片机是 4(32 除以 8)。本教程所用的单片机是 8 位的 51 内核单片机,因此“对齐倍数”是 1。1 是可以被任
何整数整除的,因此,8 位单片机在结构体的使用上被内存对齐的“干扰”是最小的。