首页 / C语言 / C语言中结构体参数变量的传递
C语言中结构体参数变量的传递
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C语言中结构体参数变量的传递,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8558字,纯文字阅读大概需要13分钟。
内容图文
![C语言中结构体参数变量的传递](/upload/InfoBanner/zyjiaocheng/1189/43b3199887f742ff8bbc772899e8a6be.jpg)
c语言 结构体 函数 参数 传递
一、前言
本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义如下:
// 员工信息结构体 typedef struct { INT8 szEmployeeName[100]; // 员工姓名 UINT16 iEmployeeAge; // 员工年龄 UINT32 iEmployeeNo; // 员工工号 } TEmployeeInfo;
函数GetEmployeeInfo用来对员工信息字段进行赋值,其声明如下:
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);
在主函数main中,采用两种参数传递的方法,一种是指针传递,另一种是非指针传递。
二、采用指针传递时的程序代码
采用指针传递时的程序代码如下:
/**********************************************************************
* 版权所有 (C)2014, Zhou Zhaoxiong 。
*
* 文件名称: TestStruct.c
* 文件标识: 无
* 内容摘要: 用于演示结构体变量的用法
* 其它说明: 无
* 当前版本: V1.0
* 作 者:
* 完成日期: 20170711
*
**********************************************************************/
#include <stdio.h>
#include <string.h>
// 数据类型
typedef signed char INT8;
typedef unsigned char UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
// 员工信息结构体
typedef struct
{
INT8 szEmployeeName[100]; // 员工姓名
UINT16 iEmployeeAge; // 员工年龄
UINT32 iEmployeeNo; // 员工工号
} TEmployeeInfo;
// 函数声明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); // 获取员工信息函数
INT32 main(void);
/****************************************************************
* 功能描述 : 主函数
* 输入参数 : 无
* 输出参数 : 无
* 返回值: 0-执行成功 -1-执行失败
* 其他说明: 无
* 修改日期 版本号 修改人 修改内容
* ----------------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 创建
****************************************************************/
INT32 main(void)
{
INT32 iRetValue = 0; // 该变量用于表示调用GetEmployeeInfo函数返回的值
TEmployeeInfo *ptEmployeeInfo = NULL; // 该变量用于存放员工信息
// 调用函数对员工信息字段赋值, 并打印出来
iRetValue = GetEmployeeInfo( ptEmployeeInfo );
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf("员工信息为: \n姓名: %s\n年龄: %d\n工号: %d\n", ptEmployeeInfo->szEmployeeName, ptEmployeeInfo->iEmployeeAge, ptEmployeeInfo->iEmployeeNo);
return 0;
}
/**********************************************************************
* 功能描述:对员工信息字段赋值
* 输入参数: ptEmployeeInfo: 员工信息结构体
* 输出参数: ptEmployeeInfo: 员工信息结构体
* 返回值: 0-成功 -1-失败
* 其它说明:无
* 修改日期 版本号 修改人 修改内容
* --------------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)
{
// 先对输入的指针参数进行异常判断
if (ptEmployeeInfo == NULL)
{
printf("Input parameter is NULL.\n");
return -1;
}
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 对姓名字段赋值
ptEmployeeInfo->iEmployeeAge = 100; // 对年龄字段赋值
ptEmployeeInfo->iEmployeeNo = 123456; // 对工号字段赋值
return 0; // 赋值成功, 返回0
}
程序的运行结果如图1所示:
650) this.width=650;" src="/upload/getfiles/default/2022/11/5/20221105033302006.jpg" />
图1 采用指针传递时的程序代码运行结果
从图1可以看出,函数GetEmployeeInfo的入参为空,不能实现赋值的功能。
三、改进后的采用指针传递时的程序代码
既然程序打印出指针为空的信息,那么我们先对传入的指针进行赋值操作是不是就可以了呢?
改进后的采用指针传递时的程序代码如下:
/**********************************************************************
* 版权所有 (C)2014, Zhou Zhaoxiong 。
*
* 文件名称: TestStruct.c
* 文件标识: 无
* 内容摘要: 用于演示结构体变量的用法
* 其它说明: 无
* 当前版本: V1.0
* 作 者: 周兆熊
* 完成日期: 20140617
*
* 修改记录 1 : // 修改历史记录 , 包括修改日期、版本号、修改人及修改内容
* 修改日期: 20140617
* 版 本 号: V1.0
* 修 改 人: Zhou Zhaoxiong
* 修改内容: 创建
**********************************************************************/
#include <stdio.h>
#include <string.h>
// 数据类型
typedef signed char INT8;
typedef unsigned char UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
// 员工信息结构体
typedef struct
{
INT8 szEmployeeName[100]; // 员工姓名
UINT16 iEmployeeAge; // 员工年龄
UINT32 iEmployeeNo; // 员工工号
} TEmployeeInfo;
// 函数声明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); // 获取员工信息函数
INT32 main(void);
/****************************************************************
* 功能描述 : 主函数
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值: 0- 执行成功 -1-执行失败
* 其他说明 : 无
* 修 改日期 版本号 修改人 修改内容
* --------------------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 创建
****************************************************************/
INT32 main(void)
{
INT32 iRetValue = 0; // 该变量用于表示调用GetEmployeeInfo函数返回的值
TEmployeeInfo * ptEmployeeInfo = NULL; // 该变量用于存放员工信息
// 先对员工信息字段赋值 , 防止空指针的存在
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Di Renjie", strlen("Di Renjie")); // 对姓名字段赋值
ptEmployeeInfo->iEmployeeAge = 150; // 对年龄字段赋值
ptEmployeeInfo->iEmployeeNo = 654321; // 对工号字段赋值
// 调用函数对员工信息字段赋值, 并打印出来
iRetValue = GetEmployeeInfo( ptEmployeeInfo );
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf(" 员工信息为 : \n 姓名 : %s\n 年龄 : %d\n 工号 : %d\n", ptEmployeeInfo ->szEmployeeName, ptEmployeeInfo ->iEmployeeAge, ptEmployeeInfo ->iEmployeeNo);
return 0;
}
/**********************************************************************
* 功能描述: 对员工信息字段赋值
* 输入参数: ptEmployeeInfo: 员工信息结构体
* 输出参数: ptEmployeeInfo: 员工信息结构体
* 返 回 值: 0- 成功 -1-失败
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)
{
// 先对输入的指针参数进行异常判断
if (ptEmployeeInfo == NULL)
{
printf("Input parameter is NULL.\n");
return -1;
}
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 对姓名字段赋值
ptEmployeeInfo->iEmployeeAge = 100; // 对年龄字段赋值
ptEmployeeInfo->iEmployeeNo = 123456; // 对工号字段赋值
return 0; // 赋值成功, 返回0
}
程序的运行结果如图2所示:
650) this.width=650;" src="/upload/getfiles/default/2022/11/5/20221105033302201.jpg" />
图2 改进后的采用指针传递时的程序代码运行结果
可见,程序出现了内存问题。原因是在传递之前,ptEmployeeInfo指针已经指向了确定的地址,不能让同一个指针同时指向不同的地址。
四、第二次改进后的程序代码
既然不能用指针作为参数进行传递,那么我们就要考虑另外的方法。
以下代码采用非指针的传递方式:
/**********************************************************************
* 版权所有 (C)2014, Zhou Zhaoxiong 。
*
* 文件名称: TestStruct.c
* 文件标识: 无
* 内容摘要: 用于演示结构体变量的用法
* 其它说明: 无
* 当前版本: V1.0
* 作 者: 周兆熊
* 完成日期: 20140617
*
* 修改记录 1 : // 修改历史记录 , 包括修改日期、版本号、修改人及修改内容
* 修改日期: 20140617
* 版 本 号: V1.0
* 修 改 人: Zhou Zhaoxiong
* 修改内容: 创建
**********************************************************************/
#include <stdio.h>
#include <string.h>
// 数据类型
typedef signed char INT8;
typedef unsigned char UINT16;
typedef unsigned int UINT32;
typedef signed int INT32;
// 员工信息结构体
typedef struct
{
INT8 szEmployeeName[100]; // 员工姓名
UINT16 iEmployeeAge; // 员工年龄
UINT32 iEmployeeNo; // 员工工号
} TEmployeeInfo;
// 函数声明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); // 获取员工信息函数
INT32 main(void);
/****************************************************************
* 功能描述 : 主函数
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值: 0- 执行成功 -1-执行失败
* 其他说明 : 无
* 修改日期 版本号 修改人 修改内容
* --------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 创建
****************************************************************/
INT32 main(void)
{
INT32 iRetValue = 0; // 该变量用于表示调用GetEmployeeInfo函数返回的值
TEmployeeInfo tEmployeeInfo = {0}; // 该变量用于存放员工信息
// 调用函数对员工信息字段赋值, 并打印出来
iRetValue = GetEmployeeInfo( &tEmployeeInfo );
if (iRetValue != 0)
{
printf("exec GetEmployeeInfo failed.\n");
return -1;
}
printf(" 员工信息为 : \n 姓名 : %s\n 年龄 : %d\n 工号 : %d\n", tEmployeeInfo .szEmployeeName, tEmployeeInfo .iEmployeeAge, tEmployeeInfo .iEmployeeNo);
return 0;
}
/**********************************************************************
* 功能描述: 对员工信息字段赋值
* 输入参数: ptEmployeeInfo: 员工信息结构体
* 输出参数: ptEmployeeInfo: 员工信息结构体
* 返 回 值: 0- 成功 -1-失败
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* --------------------------------------------------------------
* 20140617 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo)
{
// 先对输入的指针参数进行异常判断
if (ptEmployeeInfo == NULL)
{
printf("Input parameter is NULL.\n");
return -1;
}
strncpy((char *)ptEmployeeInfo->szEmployeeName, "Li Yuanfang", strlen("Li Yuanfang")); // 对姓名字段赋值
ptEmployeeInfo->iEmployeeAge = 100; // 对年龄字段赋值
ptEmployeeInfo->iEmployeeNo = 123456; // 对工号字段赋值
return 0; // 赋值成功, 返回0
}
程序的执行结果如图3所示:
650) this.width=650;" src="/upload/getfiles/default/2022/11/5/20221105033302372.jpg" />
图3第二次改进后的程序代码执行结果
从图3可以看出,程序执行结果正确,得到了我们想要的结果。
五、总结
在编写代码的过程中,我们需要注意以下方面:
(1) 程序头部、函数头部及重要的程序语句处一定要有注释,这体现了软件开发人员的专业素养。
(2) 函数中出现的变量在定义的同时要进行初始化,函数在调用之前一定要先进行声明。
(3) 对于函数中的指针变量参数,在使用之前一定要先进行异常判断(即判断其是否为NULL)。
(4) 对于有返回值的函数,要用不同的返回值来区别不同的执行结果,并在重要的地方打印出提示信息,方便对代码的调试。
指针是C语言的精华所在,同时也是难点所在。对于一个合格的软件开发工程师来说,一定要熟练掌握指针的使用方法。
本文出自 “帆布鞋也能走猫步” 博客,请务必保留此出处http://9409270.blog.51cto.com/9399270/1946424
原文:http://9409270.blog.51cto.com/9399270/1946424
内容总结
以上是互联网集市为您收集整理的C语言中结构体参数变量的传递全部内容,希望文章能够帮你解决C语言中结构体参数变量的传递所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。