C语言中结构体变量之间赋值

       最近,我阅读了某新员工小刘写的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,欢迎关注!)