C语言 结构体作为参数和返回值使用
方案一:结构体变量作为参数,进行传值。
编译器需要拷贝,不影响origin value,使用成员操作符(.)直接访问
/**********************************************************************
* 版权所有 (C)2017, Wang maochun。
*
* 文件名称:travel.cpp
* 文件标识:无
* 内容摘要:主要演示结构体作为参数以及返回值
* 其它说明:"传值”
* 当前版本:V1.0
* 作 者:Wang maochun
* 完成日期:2017.7.23
*
**********************************************************************/
#include <iostream> struct travel_time
{
int hours;
int mins;
}; const int Mins_per_hr = ; travel_time sum(travel_time t1,travel_time t2);
void show_time(travel_time t); int main()
{
using namespace std;
travel_time day1 = {,}; //5 hours 45 minutes
travel_time day2 = {,}; //4 housr 55 minutes travel_time trip = sum(day1,day2);
cout << "Two-day total:";
show_time(trip); travel_time day3 = {,};
cout << "Three-day total:";
show_time(sum(trip,day3)); return ;
} travel_time sum(travel_time t1,travel_time t2)
{
travel_time total; total.mins = (t1.mins + t2.mins) % Mins_per_hr;
total.hours = (t1.hours + t2.hours) + (t1.mins + t2.mins) / Mins_per_hr; return total;
} void show_time(travel_time t)
{
using namespace std;
cout << t.hours << "hours,"
<< t.mins << "minutes\n";
}
运行结果:

方案二:结构体指针作为参数,传地址。
编译器不需要拷贝,和main函数采用相同地址。为了不影响origin value,使用const修饰
使用指针指向结构体操作符(->)间接访问
/**********************************************************************
* 版权所有 (C)2017, Wang maochun。
*
* 文件名称:travel.cpp
* 文件标识:无
* 内容摘要:主要演示结构体作为参数以及返回值
* 其它说明:"传地址”
* 当前版本:V1.0
* 作 者:Wang maochun
* 完成日期:2017.7.23
*
**********************************************************************/
#include <iostream> struct travel_time
{
int hours;
int mins;
}; const int Mins_per_hr = ; travel_time sum(travel_time* t1,travel_time* t2);
void show_time(travel_time* t); int main()
{
using namespace std;
travel_time day1 = {,}; //5 hours 45 minutes
travel_time day2 = {,}; //4 housr 55 minutes travel_time trip = sum(&day1,&day2);
cout << "Two-day total:";
show_time(&trip); travel_time day3 = {,};
cout << "Three-day total:";
travel_time trip1 =sum(&trip,&day3);
show_time(&(trip1)); return ;
} travel_time sum(travel_time* t1,travel_time* t2)
{
travel_time total; total.mins = (t1->mins + t2->mins) % Mins_per_hr;
total.hours = (t1->hours + t2->hours) + (t1->mins + t2->mins) / Mins_per_hr; return total;
} void show_time(travel_time* t)
{
using namespace std;
cout << t->hours << "hours,"
<< t->mins << "minutes\n";
}
结果和方案一相同。
出现的错误:
show_time(&(sum(&day1,&day2)));这样写时,出现taking address of temporary fpermissive错误。
原因是:
Your middle result which is a temporary variable since it will disappear
If you assign the result of sum(&day1,&day2) to a variable then it will no longer be a temporary and you can then take the address of it.
因此,不能对未赋值的临时变量取地址
C语言 结构体作为参数和返回值使用的更多相关文章
- go语言结构体作为函数参数,采用的是值传递
经过验证,go语言结构体作为函数参数,采用的是值传递.所以对于大型结构体传参,考虑到值传递的性能损耗,最好能采用指针传递. 验证代码: package main import ( "fmt& ...
- go语言结构体
定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...
- c语言结构体可以直接赋值
结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //de ...
- Linux C语言结构体-学习笔记
Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...
- 06. Go 语言结构体
Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- 漫谈C语言结构体
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- 漫谈C语言结构体【转】
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- C/C++语言结构体指针的使用
C/C++语言结构体指针的使用 主要内容 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使用 指针的使用 代码内容重点 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使 ...
随机推荐
- Amazon Headlines Update on Activity in US West Coast Ports
According to news reports, freighter cargo may not be offloaded at U.S. West Coast ports from Februa ...
- asp之GetArray提取链接地址,以$Array$分隔的代码
'================================================== '函数名:GetArray '作 用:提取链接地址,以$Array$分隔 '参 数:ConStr ...
- charles 在mac下 抓取 https包
1. 打开charles --> help --> SSL proxying --> install charles root certificate 2. 在弹出的添加证书窗口中 ...
- Spring Bean注册解析(一)
Spring是通过IoC容器对Bean进行管理的,而Bean的初始化主要分为两个过程:Bean的注册和Bean实例化.Bean的注册主要是指Spring通过读取配置文件获取各个bean的 ...
- Android 7.1.1 又出幺蛾子了 —— 再谈 Android 上的 Wifi 连接
在之前的博客文章中,我写了点在 Android 6 系统中连接到指定名称的 Wifi 的体验.然而,在 Android 7 中,有一些东西又变化了.另外就是在那篇文章中我说要提供代码,结果拖到这篇文章 ...
- DS01--抽象数据类型
一.作业内容 二.数据结构.函数说明 1.头文件 common.h 2.数据结构 Rational.h 三.代码实现说明 1.构造有理数T 2.销毁有理数T 3.e返回有理数的分子或分母 4.用e改变 ...
- OSG学习:LOD、数据分页、动态调度
LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.在OSG的场景结点组织结 ...
- DNS缓存服务器的配置步骤
yum安装bind 编辑主配置文件/etc/named.conf 修改全局配置文件段 listen-on port 53 {172.16.19.45;}; //allow-query ...
- js动态显示指定的时间
<p id="timeShow">17:0:50</p> <script> setInterval("time()", 10 ...
- Java多线程编程(学习笔记)
一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...