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

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

目录
相关文章
|
27天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
48 12
|
1月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
142 14
|
1月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
173 10
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
38 5
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
169 13
|
2月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
2月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
76 11
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
62 4
|
C语言
c语言 结构体变量的定义初始化,成员的访问赋值,无名结构体
----结构体概述: 结构体就是将很多不同类型的数据包含在一起。 比如里面包含学生姓名、年龄、成绩:char name[20] ; int age ; double score,这些包含的都叫做结构体的成员; 当信息非常多修改就会发生错误,用结构体就会比较方便。
199 0
|
C语言
【C 语言】结构体 ( 结构体变量之间的赋值 )
【C 语言】结构体 ( 结构体变量之间的赋值 )
485 0
【C 语言】结构体 ( 结构体变量之间的赋值 )