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: 沙 ...
随机推荐
- std::string::find_last_not_of
public member function <string> std::string::find_last_not_of C++98 C++11 string (1) size_t fi ...
- Jmeter入门15 JSON Assertion 适用于json格式的响应断言
当响应结果是json格式时,用JSON Assertion更方便判断. 1 在请求上右键添加json断言 2 编辑json Assertion 判断方式: 如果响应结果不是json格式的,fail ...
- nodejs protobuff node-protobuf c++ windows扩展安装笔记
https://www.npmjs.com/package/node-protobuf 按照作者所说的办法在windows平台安装的办法,先到google的github下载2.6.1版本的protob ...
- Ajax,Json数据格式
同步和异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随 意做其他事 ...
- PL/SQL知识点
1.ROW_NUMBER() OVER(PARTITION BY XXX ORDER BY XXX) SELECT STP.FLOW_INST_ID, BUU.USER_NAME, ORGG.NAME ...
- 在VS2010 中使用subversion 进行代码的分支与合并
在实际开发总,遇到了这种情况: 开发版本1,开发版本2 ,更新产品时要求1在前,2在后. 但是因为时间要求,必须2个版本同时开发.这时就想到了在svn的版本分支合并. 创建分支之前,首先把当前版本代码 ...
- Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)
代码重构,为了确保功能的等效性,梳理代码时,发现如下代码: public SingleRespTTO fundI(SingleReqTTO request) throws Exception { re ...
- gcc扩展语法一:在表达式中的语句和声明
在GNU C中包含在括号中的复合语句可以作为一个表达式.这就允许你在表达式中使用循环,switch和局部变量. 以前复合语句是包含在大括号中语句序列.在这种构造中,圆括号包围在大括号中.如下面的例子: ...
- JS中遍历数组、对象的方式
1.标准的for循环遍历数组 //不打印自定义属性和继承属性 var array = [1,2,3]; for (var i = 0; i < array.length; i++) { cons ...
- the “inner class” idiom
有些时候我们需要upcast为多种类型,这种情况下除了可以使用multiply inherits还可以inner class. 以下为例子: //: C10:InnerClassIdiom.cpp / ...