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++ 结构体传参问题的更多相关文章

  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. C++ double 小数精度控制

    第一种方法:cout<<fixed<<setprecision(20)<<mydouble<<endl; #include <iostream&g ...

  2. 如何查找Fiori UI上某个字段对应的后台存储表的名称

    今天微信群里有朋友问到这个问题. 如果是SAPGUI里的事务码,比如MM01,对于开发者来说这个任务非常容易完成. 比如我想知道下图"Sales Unit"这个字段的值到底保存在哪 ...

  3. Node.js使用MySQL数据库中对RowDataPacket对象的使用

    使用Node.js开发使用MySQL数据库的网站,在查询后返回一RowDataPacket类型的对象 原先使用toString()方法一直得到仅为object的字符串,无法使用 后思考,才发现忽略了其 ...

  4. git报错error: src refspec refs/heads/master does not match any.

    $ git pusherror: src refspec refs/heads/master does not match any.error: failed to push some refs 出错 ...

  5. CSU 1023 修路(二分+模拟)

    前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路.假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(n ≤ m ≤ 300).为了 ...

  6. [Oracle]Audit(一)--认识Audit

    1.Audit的概念 Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析.利用Audit功能,可以完成以下任务: 监视和收集特定数据库活动的数据.例如管理员能够审计哪些表被更新,在某 ...

  7. python使用sqlalchemy连接mysql数据库

    环境:centos7+python2.7.5+sqlalchemy sqlalchemy是python当中比较出名的orm程序.在python中,使用sqlalchemy连接mysql数据库进行操作非 ...

  8. 【oracle使用笔记3】sql查询遇到的若干问题总结

    在整个开发过程中,sql查询操作的频率比较高,在不同的业务场景下会出现不同的查询需求,以下是我在项目中遇到的查询需求,总结一下. [查询一]:取查询出的第一条数据 select * from (sel ...

  9. 序列(Sequence)创建、使用、修改和删除

    序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成. 语法结构:创建序列 CREATE SEQUENCE sequence_na ...

  10. select()事件默认选中文本框的全部内容,并改变其背景色和文字颜色

    1.select()事件默认选中文本框的全部内容 拿到input标签的节点,调用select()方法即可.但是我做的vue项目中调用了此方法有一个bug,单次点击会全选内容,双次点击的时候全选会闪一下 ...