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: 沙 ...
随机推荐
- javascript Object与Array用法
引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起.引用类型的值是引用类型的一个实例. 一.Object ECMAScript中的对象其实就是一组数据和功能的结合. Object类型其实是所 ...
- 一个简单的例子理解Kubernetes的三种IP地址类型
很多Kubernetes的初学者对Kubernetes里面三种不同的IP地址和工作机制理解得不是很清楚. 本文我们通过一个最简单的例子来学习. 用如下命令行创建一个基于nginx的deployment ...
- linux shell中 if else以及大于、小于、等于逻辑表达式介绍
在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下, 比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注 ...
- L2范数惩罚项,高维线性回归
%matplotlib inline import mxnet from mxnet import nd,autograd from mxnet import gluon,init from mxne ...
- POJ 2342 树的最大独立集
题意:在树的最大独立集的基础上,加上权值.求最大. 分析: 采用刷表的方式写记忆化,考虑一个点选和不选,返回方式pair 型. 首先,无根树转有根树,dp(root). 注意的是:u不选,那么他的子节 ...
- luogu P1710 地铁涨价
嘟嘟嘟 一道最短路好题. 首先明确一点,把一条边的边权变成2,等于删去这条边.因为变成2后最短路肯定不会经过这条边,就相当于删去这条边了. 所以题目变成了依次删去Q条边,求每一次删完边后有几个点的最短 ...
- 【转】Android Fragment 真正的完全解析(上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fra ...
- (第三场) A PACM Team 【dp,五维背包】
链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- Android学习笔记_69_android 支付宝之网页支付和快捷支付
参考资料: https://b.alipay.com/order/productDetail.htm?productId=2013080604609654 https://b.alipay.com/o ...
- HDU 1372 Knight Moves(最简单也是最经典的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...