以结构体为参数的函数如何改变传入通过函数给结构体成员赋值的值

有关结构体变量成员作为函数参数的一些问题
[问题点数:40分,无满意结帖,结帖人niexuezhi2384]
本版专家分:5
结帖率 62.5%
CSDN今日推荐
本版专家分:1097
本版专家分:5040
本版专家分:8317
本版专家分:820
本版专家分:43836
2013年7月 总版技术专家分月排行榜第一
2013年7月 C/C++大版内专家分月排行榜第一
2015年9月 C/C++大版内专家分月排行榜第二2013年6月 C/C++大版内专家分月排行榜第二
本版专家分:5
本版专家分:5
本版专家分:5
本版专家分:3115
2018年6月 C/C++大版内专家分月排行榜第三
本版专家分:3115
2018年6月 C/C++大版内专家分月排行榜第三
本版专家分:369170
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:369170
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
其他相关推荐
一、结构体的多层封装
在头文件中进行声明:
typedef struct
char summary[45];
char datetime[20];
char repeat_type[10];
char voice_data_url[125];
char voice_file_id[40];
unsigned char voice_
}SCHEDULE_IT
把结构体作为参数传递
1.对于我来这样是很难理解的。结构体名不像数组名那样是这块内存块的地址。当用结构体指针做参数的时候。就应该用&来取出该结构体的地址,
才能使用。
2.当把就够体名作为参数的时候。如
struct name funds {
/*建立结构体*/
char bank[10];
cahr name1[10];
..........
结构体的成员名和变量名不在同一命名空间中,编译器可以从语法上区分成员名和变量名,所以结构体的成员名和变量名可以取一样的,不冲突;
枚举类型的成员是常量,它们的值由编译器自动分配,从0开始,当然也可以人为选择不从0开始分配。枚举常量也是一种整形,其值在编译时确定,因此也可以出现在常量表达式中。枚举的成员名和变量名在同一命名空间,所以变量名和枚举的成员名不可以一样,会出现命名冲突。
编译器的工作分
在结构体内部如下定义是违法的:
因为内部包含自己的成员永远不会终止,类似递归。
但是如下定义是合法的:
struct s *b;
这是因为其内部是个指向该结构体类型的指针,而指针的长度是可以确定的,一般四个字节。
用VC6.0的MFC编程,一直对结构体作为函数参数的问题比较头疼,一直回避,今天又遇到了,于是查找资料解决一下心头的疑问,一直用指针来处理结构体,所以对于函数的形参也用指向结构体的指针来传递。
完成目的:初始化结构体数组中的bProcess都为0
1:定义结构体
struct NODE
用结构体变量作实参时,采取的是“值传递”的方式。形参必须是同类型的结构体变量。在函数调用期间,形参也要战胜内在单元,系统将实参中各成员的值传递给形参的各个成员。这种传递方式在空间和时间上开销较大。此外,由于采用值传递方式,实参向形参意向传递数据,实参能够影响形参,但形参的值不会影响实参。 例如:
有一个结构体变量stu,内含学生学号、姓名、和3门课程的成绩。要求在函数add10中将小于60分的
Shader &Custom/one/simple shader& {
SubShader {
//定义顶点函数
#pragma vertex vert
//片元函数
#pragma fragment frag
使用结构体来定义顶点着色器的输入
一、函数调用指针时
void main(void)
fun(&a,&b);
void fun(*p1,*p2)
1、此时函数声明参数是两个指针,因此主函数中函数的调用参数应该输入两个指针,就是a,b的地址。
2、再次强调,需要改变输入参数的值时函
今天做C++作业遇到一个问题,需要下次自动登录
现在的位置:
& 综合 & 正文
C语言中结构体参数变量的传递
【文章摘要】
在C语言中,结构体参数变量经常作为函数的参数来进行传递。但如果参数设置不当,会出现内存问题。
本文以实际的程序代码为例,详细地介绍如何正确地使用结构体参数变量,为相关的开发工作提供了参考。
【关键词】
本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义如下:
// 员工信息结构体
typedef struct
szEmployeeName[100];
// 员工姓名
iEmployeeA
// 员工年龄
iEmployeeNo;
// 员工工号
} TEmployeeI
函数GetEmployeeInfo用来对员工信息字段进行赋值,其声明如下:
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo);
在主函数main中,采用两种参数传递的方法,一种是指针传递,另一种是非指针传递。
二、采用指针传递时的程序代码
采用指针传递时的程序代码如下:
/**********************************************************************
* 版权所有 (C)2014, Zhou Zhaoxiong。
* 文件名称: TestStruct.c
* 文件标识:无
* 内容摘要:用于演示结构体变量的用法
* 其它说明:无
* 当前版本: V1.0
者:周兆熊
* 完成日期:
* 修改记录1:// 修改历史记录, 包括修改日期、版本号、修改人及修改内容
* 修改日期:
* 版本号: V1.0
* 修改人: Zhou Zhaoxiong
* 修改内容:创建
**********************************************************************/
#include &stdio.h&
#include &string.h&
// 数据类型
typedef signed
char INT8;
typedef unsigned char UINT16;
typedef unsigned int
typedef signed
// 员工信息结构体
typedef struct
szEmployeeName[100];
// 员工姓名
iEmployeeA
// 员工年龄
iEmployeeNo;
// 员工工号
} TEmployeeI
// 函数声明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); // 获取员工信息函数
INT32 main(void);
/****************************************************************
* 功能描述:
* 输入参数:
* 输出参数:
* 返回值: 0-执行成功
-1-执行失败
* 其他说明:
* 修改日期
* ----------------------------------------------------------------------------------------
Zhou Zhaoxiong
****************************************************************/
INT32 main(void)
// 该变量用于表示调用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);
/**********************************************************************
* 功能描述:对员工信息字段赋值
* 输入参数: ptEmployeeInfo: 员工信息结构体
* 输出参数: ptEmployeeInfo: 员工信息结构体
* 返回值: 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
// 对工号字段赋值
// 赋值成功, 返回0
程序的运行结果如图1所示:
图1 采用指针传递时的程序代码运行结果
从图1可以看出,函数GetEmployeeInfo的入参为空,不能实现赋值的功能。
三、改进后的采用指针传递时的程序代码
既然程序打印出指针为空的信息,那么我们先对传入的指针进行赋值操作是不是就可以了呢?
改进后的采用指针传递时的程序代码如下:
/**********************************************************************
* 版权所有 (C)2014, Zhou Zhaoxiong。
* 文件名称: TestStruct.c
* 文件标识:无
* 内容摘要:用于演示结构体变量的用法
* 其它说明:无
* 当前版本: V1.0
者:周兆熊
* 完成日期:
* 修改记录1:// 修改历史记录, 包括修改日期、版本号、修改人及修改内容
* 修改日期:
* 版本号: V1.0
* 修改人: Zhou Zhaoxiong
* 修改内容:创建
**********************************************************************/
#include &stdio.h&
#include &string.h&
// 数据类型
typedef signed
char INT8;
typedef unsigned char UINT16;
typedef unsigned int
typedef signed
// 员工信息结构体
typedef struct
szEmployeeName[100];
// 员工姓名
iEmployeeA
// 员工年龄
iEmployeeNo;
// 员工工号
} TEmployeeI
// 函数声明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); // 获取员工信息函数
INT32 main(void);
/****************************************************************
* 功能描述:
* 输入参数:
* 输出参数:
* 返回值: 0-执行成功
-1-执行失败
* 其他说明:
* 修改日期
* --------------------------------------------------------------------------------------------
Zhou Zhaoxiong
****************************************************************/
INT32 main(void)
// 该变量用于表示调用GetEmployeeInfo函数返回的值
TEmployeeInfo *ptEmployeeInfo = NULL;
// 该变量用于存放员工信息
// 先对员工信息字段赋值, 防止空指针的存在
strncpy((char *)ptEmployeeInfo-&szEmployeeName, "Di Renjie", strlen("Di Renjie"));
// 对姓名字段赋值
ptEmployeeInfo-&iEmployeeAge = 150;
// 对年龄字段赋值
ptEmployeeInfo-&iEmployeeNo
// 对工号字段赋值
// 调用函数对员工信息字段赋值, 并打印出来
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);
/**********************************************************************
* 功能描述:对员工信息字段赋值
* 输入参数: ptEmployeeInfo: 员工信息结构体
* 输出参数: ptEmployeeInfo: 员工信息结构体
* 返回值: 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
// 对工号字段赋值
// 赋值成功, 返回0
程序的运行结果如图2所示:
图2 改进后的采用指针传递时的程序代码运行结果
可见,程序出现了内存问题。原因是在传递之前,ptEmployeeInfo指针已经指向了确定的地址,不能让同一个指针同时指向不同的地址。
四、第二次改进后的程序代码
既然不能用指针作为参数进行传递,那么我们就要考虑另外的方法。
以下代码采用非指针的传递方式:
/**********************************************************************
* 版权所有 (C)2014, Zhou Zhaoxiong。
* 文件名称: TestStruct.c
* 文件标识:无
* 内容摘要:用于演示结构体变量的用法
* 其它说明:无
* 当前版本: V1.0
者:周兆熊
* 完成日期:
* 修改记录1:// 修改历史记录, 包括修改日期、版本号、修改人及修改内容
* 修改日期:
* 版本号: V1.0
* 修改人: Zhou Zhaoxiong
* 修改内容:创建
**********************************************************************/
#include &stdio.h&
#include &string.h&
// 数据类型
typedef signed
char INT8;
typedef unsigned char UINT16;
typedef unsigned int
typedef signed
// 员工信息结构体
typedef struct
szEmployeeName[100];
// 员工姓名
iEmployeeA
// 员工年龄
iEmployeeNo;
// 员工工号
} TEmployeeI
// 函数声明
INT32 GetEmployeeInfo(TEmployeeInfo *ptEmployeeInfo); // 获取员工信息函数
INT32 main(void);
/****************************************************************
* 功能描述:
* 输入参数:
* 输出参数:
* 返回值: 0-执行成功
-1-执行失败
* 其他说明:
* 修改日期
* --------------------------------------------------------------
* <span style="color:#17
Zhou Zhaoxiong
****************************************************************/
INT32 main(void)
// 该变量用于表示调用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);
/**********************************************************************
* 功能描述:对员工信息字段赋值
* 输入参数: ptEmployeeInfo: 员工信息结构体
* 输出参数: ptEmployeeInfo: 员工信息结构体
* 返回值: 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
// 对工号字段赋值
// 赋值成功, 返回0
程序的执行结果如图3所示:
图3第二次改进后的程序代码执行结果
从图3可以看出,程序执行结果正确,得到了我们想要的结果。
在编写代码的过程中,我们需要注意以下方面:
(1) 程序头部、函数头部及重要的程序语句处一定要有注释,这体现了软件开发人员的专业素养。
(2) 函数中出现的变量在定义的同时要进行初始化,函数在调用之前一定要先进行声明。
(3) 对于函数中的指针变量参数,在使用之前一定要先进行异常判断(即判断其是否为NULL)。
(4) 对于有返回值的函数,要用不同的返回值来区别不同的执行结果,并在重要的地方打印出提示信息,方便对代码的调试。
指针是C语言的精华所在,同时也是难点所在。对于一个合格的软件开发工程师来说,一定要熟练掌握指针的使用方法。
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:,欢迎关注!)
【上篇】【下篇】给结构体成员赋值的问题:只能用scanf语句给结构体成员赋值吗? 例如我想将主函数中已定义的一个变量直接
本回答由提问者推荐
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;怎么为结构体变量的某个成员赋值?【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:586,601贴子:
怎么为结构体变量的某个成员赋值?收藏
请问怎么为结构体变量的某个成员赋值?#include &stdio.h&#include &conio.h&struct zhanghao{ char name[10]; char passwd[10];}guanliyuan={"admin","abc"};这是声明了guanliyuan结构体变量,现在成员guanliyuan.passwd的值是abc,那怎么改变它的值为123?-------------------------------------------------------------------还有个问题char x[3],y[3]="12";请问现在怎么给x[3]赋值?貌似之后在下面使用x[3]="12";无效!-------------------------------------------------------------------还有if(a==1){
printf("123");}else{
printf("跳出if语句")}请问怎么跳出if语句,除了goto之外还有什么语句可以跳出if函数?谢谢
!!!!!!
回复1楼:update '123' set
where name='admin'..
回复3楼:好吧。不恶搞整数据库语句了。你直接gets就行。还有。if不用跳出。
passwd-&guanliyuan={'1','2','3','\0'}
貌似,我知道gets()可以!不过这个要输入的!我的意思是!不可以变量的值付给结构体变量成员的吗?
sprintf(guanliyuan.passwd,"123");x[3]越界了,你能使用x[0] x[1] x[2],并且能为他们赋char值而不是char*, x[0] = '1' ; x[1] = '2' ; x[2] = '\0';或者用其他为字符串赋值的函数,这则是操作头指针 x
回复5楼:碉堡了
x应该用字符串赋值函数
回复6楼:strcpy(pwdword,&123&)。酱紫吗?
strcpy(pwdword,"123");这样可以的!
貌似如下错误#include &string.h&#include &conio.h&void main(void){ char x[3]; strcpy(x,"12"}; getch();}
学到结构体了,居然还不懂字符串赋值,LZ看的什么书,第一章开始重修吧
strcpy(guanliyuan.password,&123&);
登录百度帐号已解决问题
C语言以结构体作为函数的参数,传递参数的时候传的是地址还是值?
举例(只是一个具体的例子,并非对问题的限定描述):现已有struct string { char *};其中 string-&val 指向动态分配内存。那么其他由 string 复合而成结构体,应该采用拷贝语义,还是仍然用指针来引用?这两种方式各有什么利弊?方式A:struct header {};方式B:struct header { struct string * struct string *};
浏览次数:516
用手机阿里扫一扫
最满意答案
这就是浅复制与深复制的区别,浅复制在这里很容易导致指针访问违例,如果一定要指向同一个对象,在cpp下通常使用智能指针解决这种问题.
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok

我要回帖

更多关于 c语言结构体成员函数 的文章

 

随机推荐