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

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

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

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

根据代码示例:

1、传递结构体变量

  1. #include<iostream>
  2. #define COMMANDLENGTH 100
  3. 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. tempMessage.oneField = ;
  25. tempMessage.twoField = ;
  26. recvMessage = newMessage.Deliver(tempMessage);//recvMessage用来接收函数的返回值
  27. cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
  28. system("pause");
  29. }
  30.  
  31. inline Message NewMessage::Deliver(Message stu)
  32. {
  33. Message temp;
  34. temp = stu;
  35. temp.oneField = ;
  36. temp.twoField = ;
  37. return temp;
  38. }
  39.  
  40. 补充:函数的执行结果会将结构体的变量值成功修改!

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

  1. #include<iostream>
  2. #define COMMANDLENGTH 100
  3. 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 = ;
  27. tempMessage->twoField = ;
  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 = ;
  38. temp.twoField = ;
  39. return temp;
  40. }
  41.  
  42. 补充:函数的执行结果会将结构体的变量值成功修改!

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

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

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

  1. #include<iostream>
  2. #define COMMANDLENGTH 100
  3. 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 = ;
  36. valueMessage->twoField = ;
  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++ 结构体传参问题的更多相关文章

  1. C#调用C dll,结构体传参

    去年用wpf弄了个航线规划软件,用于生成无人机喷洒农药的作业航线,里面包含了不少算法.年后这几天将其中的算法移植到C,以便其他同事调用.昨天在用C#调用生成的dll时,遇到一些问题,折腾了好久才解决. ...

  2. go语言结构体作为函数参数,采用的是值传递

    经过验证,go语言结构体作为函数参数,采用的是值传递.所以对于大型结构体传参,考虑到值传递的性能损耗,最好能采用指针传递. 验证代码: package main import ( "fmt& ...

  3. python调用C++ DLL 传参技巧

    结构体传参:http://www.jb51.net/article/52513.htm 准备工作: C++文件(cpp):(注意在函数声明上加上extern "C" 的修饰) #i ...

  4. Go 结构体的使用

    结构体是用户定义的类型,表示若干个字段(Field)的集合.有时应该把数据整合在一起,而不是让这些数据没有联系.这种情况下可以使用结构体. 例如,一个职员有 firstName.lastName 和  ...

  5. c++调用python系列(1): 结构体作为入参及返回结构体

    最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...

  6. C语言 结构体传值与传址分析

    /********************************************************************** * 版权所有 (C)2017, Wang maochun ...

  7. 『Python CoolBook』C扩展库_其四_结构体操作与Capsule

    点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, type ...

  8. IPv4地址结构体sockaddr_in详解

    sockaddr_in结构体定义 struct sockaddr_in { sa_family_t sin_family; //地址族(Address Family) uint16_t sin_por ...

  9. CEF CefSettings 结构体 详解

    1. single_process: 设置为ture时,browser和render使用同一个进程.Chromium 不正是支持此运行模式,并且不如默认的多进程稳定. 2. no_sandbox: 沙 ...

随机推荐

  1. 如何给VirtualBox虚拟机的ubuntu LVM分区扩容

    我在VirtualBox安装的ubuntu里安装Cloud Foundry时遇到错误信息,磁盘空间不够了: 使用这三个命令做了清理之后,结果依然不够理想: (1) sudo apt-get autoc ...

  2. Android面试问题收集总结

    转载请标明出处: http://www.cnblogs.com/why168888/p/6405204.html 本文出自:[Edwin博客园] Android基础 View的绘制流程:自定义View ...

  3. IOS 集成友盟分享

    #import <Foundation/Foundation.h> @interface UMSocialSinaHandler : NSObject +(void)openSSOWith ...

  4. Android笔记之 图片自由裁剪

    前言--项目中须要用到对用户头像的裁剪和上传功能.关于裁剪.一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档.果然有.于是.就果断无耻地用了Android自带有关于照片的自由裁 ...

  5. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...

  6. Java之生成条形码、PDF、HTML

    关于Java生成HTML,可参考我的这篇文章:FreeMarker之根据模型生成HTML代码 当然了,该篇文章也会给你很多启发,比如,根据html生成html,大家不要小看这个,著名的WordPres ...

  7. java json和对象互转

    开发过程中遇到一些对象转string和string转对象的问题,浪费了很久,现在用的熟练些了,总结如下: 1.字符串尽量定义成json可解析的,如{"name":"a&q ...

  8. 18年selenium3+python3+unittest自动化测试教程(上)

    第一章 自动化测试课程介绍和课程大纲 1.自动化测试课程介绍 简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平 python3.7+selenium3 pycharm 第二章自动化 ...

  9. Java经典书籍-PDF

    密码:rhgr https://pan.baidu.com/s/17MkdVFS9JrsbseMveQePOQ

  10. linux下重新启动oracle

    第一步.以Oracle帐户进入Linux系统 第二步.执行以下命令查看数据库监听器的状况: lsnrctl status 或者查看数据库端口是否被监听(默认1521) netstat -ano | g ...