最近,我阅读了某新员工小刘写的C语言代码,发现其对结构体变量之间的赋值不是很熟悉。对于两个相同类型的结构体变量,他均采用的是逐个成员变量直接赋值的形式。如下的代码示例:
/********************************************************************** * 版权所有 (C)2015, Zhou Zhaoxiong。 * * 文件名称:Struct2Struct.c * 文件标识:无 * 内容摘要:结构体变量之间的赋值 * 其它说明:无 * 当前版本:V1.0 * 作 者:Zhou Zhaoxiong * 完成日期:20150227 * **********************************************************************/ #include #include // 重定义数据类型 typedef unsigned char UINT8; typedef unsigned int UINT32; typedef signed int INT32; // 定义结构体 typedef struct { UINT8 szName[100]; // 姓名 UINT32 iAge; // 年龄 UINT8 szId[100]; // 工号 } T_EmployeeInfo; /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------- * 20150227 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { T_EmployeeInfo tEmployeeInfoSrc = {0}; // 源消息结构体 T_EmployeeInfo tEmployeeInfoDest = {0}; // 目的消息结构体 // 手动输入源消息 printf("Please input the source info: \n"); printf("Name: \n"); scanf("%s", tEmployeeInfoSrc.szName); printf("Age: \n"); scanf("%d", &(tEmployeeInfoSrc.iAge)); printf("Id: \n"); scanf("%s", tEmployeeInfoSrc.szId); // 将源消息赋给目的消息结构体中的各个变量 strcpy(tEmployeeInfoDest.szName, tEmployeeInfoSrc.szName); tEmployeeInfoDest.iAge = tEmployeeInfoSrc.iAge; strcpy(tEmployeeInfoDest.szId, tEmployeeInfoSrc.szId); // 打印目的消息结构体中的各个变量的值 printf("The dest info is: Name=%s, Age=%d, Id=%s\n", tEmployeeInfoDest.szName, tEmployeeInfoDest.iAge, tEmployeeInfoDest.szId); return 0; }
如上代码所示,tEmployeeInfoSrc和tEmployeeInfoDest是两个类型相同的结构体变量,tEmployeeInfoSrc(源结构体变量)中的各个成员变量已赋初值。现要使tEmployeeInfoDest(目的结构体变量)中的各个成员变量的值与tEmployeeInfoSrc中对应成员变量的值相同。小刘采用的方式是各个成员变量一一赋值。这虽然可以确保赋值操作的正确性,但并不是最优的方法。
针对以上代码,我们可以稍加修改,如下所示:
/********************************************************************** * 版权所有 (C)2015, Zhou Zhaoxiong。 * * 文件名称:Struct2Struct.c * 文件标识:无 * 内容摘要:结构体变量之间的赋值 * 其它说明:无 * 当前版本:V1.0 * 作 者:Zhou Zhaoxiong * 完成日期:20150227 * **********************************************************************/ #include #include // 重定义数据类型 typedef unsigned char UINT8; typedef unsigned int UINT32; typedef signed int INT32; // 定义结构体 typedef struct { UINT8 szName[100]; // 姓名 UINT32 iAge; // 年龄 UINT8 szId[100]; // 工号 } T_EmployeeInfo; /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------- * 20150227 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { T_EmployeeInfo tEmployeeInfoSrc = {0}; // 源消息结构体 T_EmployeeInfo tEmployeeInfoDest = {0}; // 目的消息结构体 // 手动输入源消息 printf("Please input the source info: \n"); printf("Name: \n"); scanf("%s", tEmployeeInfoSrc.szName); printf("Age: \n"); scanf("%d", &(tEmployeeInfoSrc.iAge)); printf("Id: \n"); scanf("%s", tEmployeeInfoSrc.szId); // 将源消息赋给目的消息结构体 tEmployeeInfoDest = tEmployeeInfoSrc; // 打印目的消息结构体中的各个变量的值 printf("The dest info is: Name=%s, Age=%d, Id=%s\n", tEmployeeInfoDest.szName, tEmployeeInfoDest.iAge, tEmployeeInfoDest.szId); return 0; }
如上代码所示,我们可以直接将源结构体变量的值赋给目的结构体,将原来的三行代码缩减为一行。当一个结构体的成员变量较多时,各个变量逐一赋值显然过于繁琐,即采用直接赋值的方法更加简洁直观。
两个相同类型的结构体变量相互赋值的情况还有好多种,如下代码所示:
/********************************************************************** * 版权所有 (C)2015, Zhou Zhaoxiong。 * * 文件名称:Struct2Struct.c * 文件标识:无 * 内容摘要:结构体变量之间的赋值 * 其它说明:无 * 当前版本:V1.0 * 作 者:Zhou Zhaoxiong * 完成日期:20150227 * **********************************************************************/ #include #include // 重定义数据类型 typedef unsigned char UINT8; typedef unsigned int UINT32; typedef signed int INT32; // 定义结构体 typedef struct { UINT8 szName[100]; // 姓名 UINT32 iAge; // 年龄 UINT8 szId[100]; // 工号 } T_EmployeeInfo; /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------- * 20150227 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { T_EmployeeInfo tEmployeeInfoSrc = {0}; // 源消息结构体 T_EmployeeInfo *ptEmployeeInfoDest = NULL; // 目的消息结构体 T_EmployeeInfo *ptEmployeeInfoMid = NULL; // 中间消息结构体 // 手动输入源消息 printf("Please input the source info: \n"); printf("Name: \n"); scanf("%s", tEmployeeInfoSrc.szName); printf("Age: \n"); scanf("%d", &(tEmployeeInfoSrc.iAge)); printf("Id: \n"); scanf("%s", tEmployeeInfoSrc.szId); // 将源消息赋给目的消息结构体 ptEmployeeInfoDest = &tEmployeeInfoSrc; // 指针 = &变量 // 打印目的消息结构体中的各个变量的值 printf("The dest info is: Name=%s, Age=%d, Id=%s\n", ptEmployeeInfoDest->szName, ptEmployeeInfoDest->iAge, ptEmployeeInfoDest->szId); // 将目的消息赋给中间消息结构体 ptEmployeeInfoMid = ptEmployeeInfoDest; // 指针 = 指针 // 打印中间消息结构体中的各个变量的值 printf("The mid info is: Name=%s, Age=%d, Id=%s\n", ptEmployeeInfoMid->szName, ptEmployeeInfoMid->iAge, ptEmployeeInfoMid->szId); // 改变目的消息结构体中的某个变量的值 ptEmployeeInfoDest->iAge = ptEmployeeInfoDest->iAge + 1; // 将目的消息赋给源消息结构体 memcpy(&tEmployeeInfoSrc, ptEmployeeInfoDest, sizeof(T_EmployeeInfo)); // memcpy(&变量, 指针, 长度) // 打印源消息结构体中的各个变量的值 printf("The source info is: Name=%s, Age=%d, Id=%s\n", tEmployeeInfoSrc.szName, tEmployeeInfoSrc.iAge, tEmployeeInfoSrc.szId); return 0; }
指针和结构体是C语言的精华和难点所在,大家一定要在实战中学会它们的使用方法。
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)