在C语言中.结构体变量之间可以相互赋值吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C语言中.结构体变量之间可以相互赋值吗相关的知识,希望对你有一定的参考价值。

结构体变量直接赋值,就是其本身内存地址空间,按照地址分布直接赋值。
所以两个一样的结构变量可以直接赋值。
但是如果结构成员中有指针,且指针指向的地址大小不一样,是不能直接赋值的。
参考技术A 1、结构体变量是可以直接赋值的。定义结构体类型,然后用这个类型定义出来的变量就是结构体变量。
2、c语言在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,这里因为同样结构体变量,属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的。
参考技术B 可以,直接用 '=' 即可

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,欢迎关注!)

以上是关于在C语言中.结构体变量之间可以相互赋值吗的主要内容,如果未能解决你的问题,请参考以下文章

C语言中两个相同类型的结构体变量之间是可以相互直接赋值的

CString之间为啥不能互相赋值

c语言结构体能否整体赋值

C 语言结构体 ( 结构体变量之间的赋值 )

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

C语言 NULL赋结构体指针变量