从单片机基础到程序框架(全集 2019pdf版) - 第310页

struct S tructMould _2 GtMould_ 2_A; //生成第 1 个结 构体变量 struct S tructMould _2 GtMould_ 2_B //生成第 2 个结构体变 量 void m ain() //主函 数 { //先给 GtMould_ 2_A 赋初值 。 GtMould_2_ A.u32Data =1; GtMould_2_ A.u8Data= 2; //通过“整体 赋值” ,把 结构体变量…

100%1 / 836
a=sizeof(GtMould_1); //利用宏函数 sizeof 获取结构体变量所占用的字节总
}
【71.4 结构体之间的赋值。
结构体之间的赋值有两种,第一种是成员之间“一对一”的赋值,第二种是整个结构体之间“面对面”
的整体赋值。第一种成员赋值像普通变量赋值那样,没有那么多套路和忌讳,数据传递安全可靠。第二种整
个结构体之间赋值在编程体验上带有“一键操作”的快感,但是要注意避开一些“雷区”,首先,整体赋值
的前提是必须保证两个结构体变量都是同一个“结构体模板”造出来的变量,不同“模板”的结构体变量之
间禁止“整体赋值,其次,哪怕是“同一个模板”的结构体变量,也并不是所有的“同模板结构体”变
都能实现整个结构体之间的直接赋值,只有在结构体内部成员比较简单的情况下才适合“整体赋值,如果
结构体内部包含有“指针”或者“字符串”或者“其它结构体中的结构体这类情况就比较复杂,这时
议大家绕开有“雷区“整体赋值”而直接选用安全可靠的“成员赋值”什么是成员赋值”什么是
体赋值”?请看下面两个例子。
第一种:成员赋值。把结构体变量 GtMould_2_A 赋值 GtMould_2_B。
struct StructMould_2 //“造模”
{
unsigned long u32Data;
unsigned char u8Data;
};
struct StructMould_2 GtMould_2_A; //生成第 1 个结构体变量
struct StructMould_2 GtMould_2_B //生成第 2 个结构体变
void main() //主函
{
//先给 GtMould_2_A 赋初值
GtMould_2_A.u32Data=1;
GtMould_2_A.u8Data=2;
//通过“成员赋值”,把结构体变量 GtMould_2_A 赋值 GtMould_2_B。
GtMould_2_B.u32Data=GtMould_2_A.u32Data; //成员之间“一对一”的赋
GtMould_2_B.u8Data=GtMould_2_A.u8Data; //成员之间“一对一”的赋值
}
第二种:整体赋值。把结构体变量 GtMould_2_A 赋值 GtMould_2_B。
struct StructMould_2 //“造模”
{
unsigned long u32Data;
unsigned char u8Data;
};
struct StructMould_2 GtMould_2_A; //生成第 1 个结构体变量
struct StructMould_2 GtMould_2_B //生成第 2 个结构体变
void main() //主函
{
//先给 GtMould_2_A 赋初值
GtMould_2_A.u32Data=1;
GtMould_2_A.u8Data=2;
//通过“整体赋值”,把结构体变量 GtMould_2_A 赋值 GtMould_2_B。
GtMould_2_B=GtMould_2_A; //整体之间“一次性”的赋
}
上述例子中的整体赋值,是因为结构体内部的数据比较“简单”没有包含“指针”或者“字符串”或
“其它结构体中的结构体这类数据成员,如果包含这类成员,建议大家不要用整体赋值比如遇到以
这类结构体就建议大家直接用安全可靠的“成员赋值”
struct StructMould //“造模
{
unsigned char u8String[]=”String”; //字符
unsigned char *pu8Data; //指针
struct StructOtherMould GtOtherMould; //结构体中的结构体
};
【71.5 例程练习和分析。
现在编写一个练习的程序
/*---C 语言学习区域的开始。-----------------------------------------------*/
struct StructMould_1 //“造模”
{
unsigned long u32Data; //一个 unsigned long 4 个字节。
unsigned char u8Data; //一个 unsigned char 占用 1 个字节
};
struct StructMould_2 //“造模”
{
unsigned char u8Data;
unsigned long u32Data;
};
struct StructMould_1 GtMould_1; //占用多少个字节内存呢?
struct StructMould_2 GtMould_2_A;
struct StructMould_2 GtMould_2_B;
unsigned long a; //此变量用来获取结构体变 GtMould_1 所占用的字节总数
void main() //主函数
{
a=sizeof(GtMould_1); //利用宏函数 sizeof 获取结构体变量 GtMould_1 所占用的字节总数
//先给 GtMould_2_A 赋初值
GtMould_2_A.u32Data=1;
GtMould_2_A.u8Data=2;
//通过“整体赋值”,把结构体变量 GtMould_2_A 赋值 GtMould_2_B。
GtMould_2_B=GtMould_2_A; //整体之间“一次性”的赋
View(a); //把 a 发送到电脑端观察
View(GtMould_2_B.u32Data); //把结构体成员 GtMould_2_B.u32Data 发送到电脑端观察
View(GtMould_2_B.u8Data); //把结构体成 GtMould_2_B.u8Data 发送到电脑端观察
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:5
十六进制:5
二进制:101
2 个数
十进制:1
十六进制:1
二进制:1
3 个数
十进制:2
十六进制:2