c/c++ 结构体传参问题

2024-05-30 03:18
文章标签 c++ 问题 结构 体传参

本文主要是介绍c/c++ 结构体传参问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

c/c++的结构体传参可以有三种方式:

  1、传递结构体变量,值传递

  2、传递结构体指针,地址传递

  3、传递结构体成员,可是值传递也可以是地址传递

 

根据代码示例:

1、传递结构体变量

 

 1 #include<iostream>2 #define COMMANDLENGTH 1003 using std::cout;4 using std::endl;5 //注意 c和c++中struct和typedef struct有区别。6 struct Message{7     int oneField;8     short twoField;9     char command[COMMANDLENGTH];
10 }message;
11 //c++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
12 
13 class  NewMessage{
14 private:
15     //一般用来声明变量
16 public:
17     Message Deliver(Message  stu);//我让函数的返回值也是结构体,传递结构体变量
18 };
19 
20 void main()
21 {
22     NewMessage newMessage;//创建类对象
23     Message  tempMessage,recvMessage;24 
25     tempMessage.oneField = 5;
26     tempMessage.twoField = 10;
27     recvMessage = newMessage.Deliver(tempMessage);//recvMessage用来接收函数的返回值
28     cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
29     system("pause");
30 }
31 
32 inline Message  NewMessage::Deliver(Message  stu)
33 {
34     Message  temp;
35     temp = stu;
36     temp.oneField = 10;
37     temp.twoField = 20;
38     return  temp;
39 }补充:函数的执行结果会将结构体的变量值成功修改!

 

2.传递结构体指针,地址传递

 

 1 #include<iostream>2 #define COMMANDLENGTH 1003 using std::cout;4 using std::endl;5 //注意 c和c++中struct和typedef struct有区别。6 struct Message{7     int oneField;8     short twoField;9     char command[COMMANDLENGTH];
10 }message;
11 //c++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
12 
13 class  NewMessage{
14 private:
15     //一般用来声明变量
16 public:
17     Message Deliver(Message  *stu);//我让函数的返回值也是结构体,地址传递
18 };
19 
20 void main()
21 {
22     NewMessage newMessage;//创建类对象
23     Message  *tempMessage = &message;//定义Message的指针变量指向message,也就是结构体的地址
24     Message  recvMessage;
25 
26     tempMessage->oneField = 5;
27     tempMessage->twoField = 10;
28     recvMessage = newMessage.Deliver(tempMessage);//传递的是结构体的指针地址
29     cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
30     system("pause");
31 }
32 
33 inline Message  NewMessage::Deliver(Message  *stu)
34 {
35     Message  temp;
36     temp = *stu;
37     temp.oneField = 10;
38     temp.twoField = 20;
39     return  temp;
40 }补充:函数的执行结果会将结构体的变量值成功修改!

 

注意:把一个完整的结构体变量作为参数传递,要将全部成员值一个一个传递,费时间又费空间,开销大。如果结构体类型中的成员很多,或有一些成员是数组,则程序运行效率会大大降低。在这种情况下,用指针做函数参数比较好,能提高运行效率。

3.传递结构体成员,值传递或地址传递

  这种情况就是结构体内部的成员变量作为参数传递,可以使值传递,可以是地址传递。

 

 

 1 #include<iostream>2 #define COMMANDLENGTH 1003 using std::cout;4 using std::endl;5 //注意 c和c++中struct和typedef struct有区别。6 struct Message{7     int oneField;8     short twoField;9     char command[COMMANDLENGTH];
10 }message;
11 //c++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
12 
13 class  NewMessage{
14 private:
15     //一般用来声明变量
16 public:
17     int Deliver(int onefield, int twofield);
18 };
19 
20 void main()
21 {
22     NewMessage newMessage;//创建类对象
23     Message  *valueMessage = &message;//定义Message的指针变量指向message,也就是结构体的地址
24     Message  addrMessage;
25     int  sum;
26     
27     //值传递
28     /*
29         addrMessage.oneField = 5;
30         addrMessage.twoField = 10;
31         sum = newMessage.Deliver(addrMessage.oneField, addrMessage.twoField);
32     */
33     
34     //指针地址传递,引用
35     valueMessage->oneField = 5;
36     valueMessage->twoField = 10;
37     sum = newMessage.Deliver(valueMessage->oneField, valueMessage->twoField);
38     cout << sum<<endl;
39     system("pause");
40 }
41 
42 inline int NewMessage::Deliver(int onefield, int twofield)
43 {
44     int a = onefield;
45     int b = twofield;
46     return a + b;
47 }

注:转载仅作为笔记使用,如有侵权,请联系删除

这篇关于c/c++ 结构体传参问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015432

相关文章

MybatisPlus 多数据源切换@DS注解失效问题解决

《MybatisPlus多数据源切换@DS注解失效问题解决》在业务开发中使用到了多数据源,遇到了@DS注解失效问题,有两个场景使用到同一个@DS的查询方法,下面就来介绍一下该问题的解决,感兴趣的可以... 在业务开发中使用到了多数据源,遇到了@DS注解失效问题,有两个场景使用到同一个@DS的查询方法,一个正

Centos7 firewall和docker冲突问题及解决过程

《Centos7firewall和docker冲突问题及解决过程》本文描述了一个在CentOS7上使用firewalld和Docker容器的问题,当firewalld启动或重启时,会从iptable... 目录系统环境问题描述问题排查解决办法总结本文只是我对问题的记录,只能用作参考,不能China编程说明问题,请

Go语言结构体标签(Tag)的使用小结

《Go语言结构体标签(Tag)的使用小结》结构体标签Tag是Go语言中附加在结构体字段后的元数据字符串,用于提供额外的属性信息,这些信息可以通过反射在运行时读取和解析,下面就来详细的介绍一下Tag的使... 目录什么是结构体标签?基本语法常见的标签用途1.jsON 序列化/反序列化(最常用)2.数据库操作(

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++