c/c++ 结构体传参问题
c/c++的结构体传参可以有三种方式:
1、传递结构体变量,值传递
2、传递结构体指针,地址传递
3、传递结构体成员,可是值传递也可以是地址传递
根据代码示例:
1、传递结构体变量
- #include<iostream>
- #define COMMANDLENGTH 100
- using std::cout;
- using std::endl;
- //注意 c和c++中struct和typedef struct有区别。
- struct Message{
- int oneField;
- short twoField;
- char command[COMMANDLENGTH];
- }message;
- //c++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
- class NewMessage{
- private:
- //一般用来声明变量
- public:
- Message Deliver(Message stu);//我让函数的返回值也是结构体,传递结构体变量
- };
- void main()
- {
- NewMessage newMessage;//创建类对象
- Message tempMessage,recvMessage;
- tempMessage.oneField = ;
- tempMessage.twoField = ;
- recvMessage = newMessage.Deliver(tempMessage);//recvMessage用来接收函数的返回值
- cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
- system("pause");
- }
- inline Message NewMessage::Deliver(Message stu)
- {
- Message temp;
- temp = stu;
- temp.oneField = ;
- temp.twoField = ;
- return temp;
- }
- 补充:函数的执行结果会将结构体的变量值成功修改!
2.传递结构体指针,地址传递
- #include<iostream>
- #define COMMANDLENGTH 100
- using std::cout;
- using std::endl;
- //注意 c和c++中struct和typedef struct有区别。
- struct Message{
- int oneField;
- short twoField;
- char command[COMMANDLENGTH];
- }message;
- //c++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
- class NewMessage{
- private:
- //一般用来声明变量
- public:
- Message Deliver(Message *stu);//我让函数的返回值也是结构体,地址传递
- };
- void main()
- {
- NewMessage newMessage;//创建类对象
- Message *tempMessage = &message;//定义Message的指针变量指向message,也就是结构体的地址
- Message recvMessage;
- tempMessage->oneField = ;
- tempMessage->twoField = ;
- recvMessage = newMessage.Deliver(tempMessage);//传递的是结构体的指针地址
- cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
- system("pause");
- }
- inline Message NewMessage::Deliver(Message *stu)
- {
- Message temp;
- temp = *stu;
- temp.oneField = ;
- temp.twoField = ;
- return temp;
- }
- 补充:函数的执行结果会将结构体的变量值成功修改!
注意:把一个完整的结构体变量作为参数传递,要将全部成员值一个一个传递,费时间又费空间,开销大。如果结构体类型中的成员很多,或有一些成员是数组,则程序运行效率会大大降低。在这种情况下,用指针做函数参数比较好,能提高运行效率。
3.传递结构体成员,值传递或地址传递
这种情况就是结构体内部的成员变量作为参数传递,可以使值传递,可以是地址传递。
- #include<iostream>
- #define COMMANDLENGTH 100
- using std::cout;
- using std::endl;
- //注意 c和c++中struct和typedef struct有区别。
- struct Message{
- int oneField;
- short twoField;
- char command[COMMANDLENGTH];
- }message;
- //c++中结构体可在类中创建也可在类外创建,使用时区别就是在类中需要用类的对象去调用。
- class NewMessage{
- private:
- //一般用来声明变量
- public:
- int Deliver(int onefield, int twofield);
- };
- void main()
- {
- NewMessage newMessage;//创建类对象
- Message *valueMessage = &message;//定义Message的指针变量指向message,也就是结构体的地址
- Message addrMessage;
- int sum;
- //值传递
- /*
- addrMessage.oneField = 5;
- addrMessage.twoField = 10;
- sum = newMessage.Deliver(addrMessage.oneField, addrMessage.twoField);
- */
- //指针地址传递,引用
- valueMessage->oneField = ;
- valueMessage->twoField = ;
- sum = newMessage.Deliver(valueMessage->oneField, valueMessage->twoField);
- cout << sum<<endl;
- system("pause");
- }
- inline int NewMessage::Deliver(int onefield, int twofield)
- {
- int a = onefield;
- int b = twofield;
- return a + b;
- }
c/c++ 结构体传参问题的更多相关文章
- C#调用C dll,结构体传参
去年用wpf弄了个航线规划软件,用于生成无人机喷洒农药的作业航线,里面包含了不少算法.年后这几天将其中的算法移植到C,以便其他同事调用.昨天在用C#调用生成的dll时,遇到一些问题,折腾了好久才解决. ...
- go语言结构体作为函数参数,采用的是值传递
经过验证,go语言结构体作为函数参数,采用的是值传递.所以对于大型结构体传参,考虑到值传递的性能损耗,最好能采用指针传递. 验证代码: package main import ( "fmt& ...
- python调用C++ DLL 传参技巧
结构体传参:http://www.jb51.net/article/52513.htm 准备工作: C++文件(cpp):(注意在函数声明上加上extern "C" 的修饰) #i ...
- Go 结构体的使用
结构体是用户定义的类型,表示若干个字段(Field)的集合.有时应该把数据整合在一起,而不是让这些数据没有联系.这种情况下可以使用结构体. 例如,一个职员有 firstName.lastName 和 ...
- c++调用python系列(1): 结构体作为入参及返回结构体
最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...
- C语言 结构体传值与传址分析
/********************************************************************** * 版权所有 (C)2017, Wang maochun ...
- 『Python CoolBook』C扩展库_其四_结构体操作与Capsule
点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, type ...
- IPv4地址结构体sockaddr_in详解
sockaddr_in结构体定义 struct sockaddr_in { sa_family_t sin_family; //地址族(Address Family) uint16_t sin_por ...
- CEF CefSettings 结构体 详解
1. single_process: 设置为ture时,browser和render使用同一个进程.Chromium 不正是支持此运行模式,并且不如默认的多进程稳定. 2. no_sandbox: 沙 ...
随机推荐
- 如何给VirtualBox虚拟机的ubuntu LVM分区扩容
我在VirtualBox安装的ubuntu里安装Cloud Foundry时遇到错误信息,磁盘空间不够了: 使用这三个命令做了清理之后,结果依然不够理想: (1) sudo apt-get autoc ...
- Android面试问题收集总结
转载请标明出处: http://www.cnblogs.com/why168888/p/6405204.html 本文出自:[Edwin博客园] Android基础 View的绘制流程:自定义View ...
- IOS 集成友盟分享
#import <Foundation/Foundation.h> @interface UMSocialSinaHandler : NSObject +(void)openSSOWith ...
- Android笔记之 图片自由裁剪
前言--项目中须要用到对用户头像的裁剪和上传功能.关于裁剪.一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档.果然有.于是.就果断无耻地用了Android自带有关于照片的自由裁 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...
- Java之生成条形码、PDF、HTML
关于Java生成HTML,可参考我的这篇文章:FreeMarker之根据模型生成HTML代码 当然了,该篇文章也会给你很多启发,比如,根据html生成html,大家不要小看这个,著名的WordPres ...
- java json和对象互转
开发过程中遇到一些对象转string和string转对象的问题,浪费了很久,现在用的熟练些了,总结如下: 1.字符串尽量定义成json可解析的,如{"name":"a&q ...
- 18年selenium3+python3+unittest自动化测试教程(上)
第一章 自动化测试课程介绍和课程大纲 1.自动化测试课程介绍 简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平 python3.7+selenium3 pycharm 第二章自动化 ...
- Java经典书籍-PDF
密码:rhgr https://pan.baidu.com/s/17MkdVFS9JrsbseMveQePOQ
- linux下重新启动oracle
第一步.以Oracle帐户进入Linux系统 第二步.执行以下命令查看数据库监听器的状况: lsnrctl status 或者查看数据库端口是否被监听(默认1521) netstat -ano | g ...