在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语言中.结构体变量之间可以相互赋值吗的主要内容,如果未能解决你的问题,请参考以下文章