------------------------函数与结构体---------------------------------

1.结构体复习

关于结构体,我以前有对结构体做过基础的讲解。

我们可以使用关键字struct很简单的定义一个结构体:

struct travel_time
{int hours;
int mins;
};             //注意这边的这个分号

2.传递和返回结构体

我们通过一个例子来说明一下结构体与函数的结合。

我们计算行程时间的计算,我们假设驾车从南京到苏州的的时间是三小时20分钟,从苏州到上海需要两小时30分钟。对于这种时间的计算,我们可以用结构体来表示,一个结构体成员表示小时,一个结构体成员表示分钟。我们要计算所花费的时间,则两小时30分钟,我们一般表示成2.5小时。
因此,我们有如下的计算代码:

#include <iostream>
using namespace std;
//先定义一个结构体用于表示小时和分钟变量。
struct travel_time
{int hours;
int mins;
};
//为了将分钟数表示成小时的形式,我们需要定义一个常量60
int min_hours = 60;//分钟除以60即可得到小时的分数。
//声明两个需要用到的函数原型
void show_time(travel_time t);
travel_time sum(travel_time t1,travel_time t2);int main()
{//前两天的时间travel_time day1 = {3,20};travel_time day2 = {2,30};//计算前两天的总时间travel_time time_total_two = sum(day1,day2);cout<<"两天的总时间是:";show_time(time_total);travel_time day3 = {5,34};cout<<"三天的总时间是:"<<;show_time(sum(time_total_two,day3))return 0;
}
//实现上述两个函数
travel_time sum(travel_time t1, travel_time,t2)
{travel_time total;total.mins = (t1.mins + t2.mins);//计算分钟total.hours = (t1.hours + t2.hours)+(t1.mins + t2.mins)/min_hours;//计算小时return total;
}
//定义一个显示时间的函数
void show_time(travel_time t)
{cout<<t.hours<<"小时,"<<t,mins<<"分钟。"<<endl;return 0 ;
}

在上述代码中,travel_time 就是一个标准的类型名。

3. 传递结构的地址

3.1 处理结构的另一种形式

我们使用一个直角坐标到极坐标的转换的例子来讲述这个例子。

#include <iostream>
#include <cmath>//数学函数库
using namespace std;
//创建两个结构体,分别表示直角坐标系的x和y,一盒基坐标系的距离和角度。
struct ploar
{double distence;double angle;
};struct recet
{double x;double y;
};
//写两个函数原型
polar recet_to_polar(recet xypos);//直角坐标到极坐标的转换函数
void show_polar(polar dapos);
//主函数部分int main()
{recet rplace;polar pplace;cout << "输入直角坐标系中x和y的值: ";while (cin >> rplace.x >> rplace.y){pplace = recet_to_polar(rplace);show_polar(pplace);cout << "接下来的两个值: ";}cout << ""完成。 \n;return 0;
}
//实现上述两个函数
//1.将基坐标系的参数转换成极坐标系,具体数学思想,大家高中应该都知道
polar recet_to_polar(recet xypos)
{polar anwswer;//创建一个结构体对象,实现使用点结构获取成员answer.distence = sqrt(xypos.x * xypos.x + xypos.y * xypos.y);//计算距离answer.polar = atan2(xypos.y , xypos.x);//计算偏移角度return answer;
}
//2. 显示函数
void show_polar (polar dapos)
{const double rad_to_deg = 57.29577951;//两种角度形式的转换关系cout << "距离 = " << dapos.distence;cout << ",角度 = " <<dapos.angle * rad_to_deg;cout <<"degrees\n";return 0;
}

下面,我们根据上面的例子,对其进行拓展,实现传递结构的地址。

3.2 传递结构的地址

假设要传递结构的地址而不是整个结构以节省时间和空间,则需要重新编写前面的函数,使用指向结构的指针。首先看一看如何编写show_polar()函数。需要修改下面三个地方:

  1. 调用函数时,将结构的地址(&平place)而不是结构本身(pplace)传递给他。
  2. 将形参声明为指向polar的指针,即polar*类型。由于函数不应该修改结构,因此使用了从上图关键字来约束。
  3. 由于形参是指针而不是结构,因此应间接成员运算符(->),而不是成员运算符(.句点的形式)

根据上面三个方面修改的代码如下:

void show_polar (const polar * pda)
{const double rad_to_deg = 57.29577951;cout << "距离 = "<< pda->distance;cout << ", 角度 = "<< pda->angle * rad_to_deg ;cout <<"degrees\n";return 0;
}

下面对recet_to_polar()函数进行修改。

void recet_to_polar(const recet * pxy,polar * pda)
{pda->distence = sqrt(pxy->x * pxy ->x * +pxy->y * pxy ->y);pda->angel = atan2(pxy->y,pxy->x);eturn 0;
}

由于原来的recet_to_polar函数返回一个结构,因此修改修改方法更复杂些。**为了充分利用指针的下利率,应使用指针,而不是返回值。**为此,需要将两个指针传递给该函数,第一个指针指向要转换的结构,第二个指针指向存储转换结果的结构。函数不返回一个新的结构,而是修改调用函数中已有的结构。因此,第一个参数是const指针,但第二个参数却不是。

C++函数(三)------函数与结构体相关推荐

  1. 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...

  2. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定

    上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...

  3. [C] 三、回调结构体

    三.回调结构体 作者:解琛 时间:2020 年 12 月 18 日 #include <stdio.h> #include <string.h> #include <st ...

  4. C++阶段01笔记汇总【C++软件安装、C++初识、数据类型、运算符、程序流程结构、数组、函数、指针、结构体】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 C++课程安排 1 C++初识 1.1 第一个C++程序 1.1.1 创建项目 1.1.2 创建文件 1.1.3 编写代码 1. ...

  5. JNI调用c++函数,该函数的参数是结构体(——对象的传递)

    第三方C++函数接口为 int api_get_logfile(Struct fileinfo tfile),参数是个结构体,且套了另一个结构体: struct fileinfo{  char *fu ...

  6. c语言中结构体头文件是什么,函数形参里有结构体指针,为什么在头文件生

    满意答案 lam950 2017.04.08 采纳率:59%    等级:8 已帮助:913人 C语言用结构体指针作函数参数 这种方式比用结构体变量作函数参数效率高,因为无需传递各个成员的值,只需传递 ...

  7. struct timeval结构体 以及 gettimeofday()函数、struct timespec结构体

    struct timeval结构体 struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __ ...

  8. 函数指针数组指针+结构体数组

    /***************** 结构体数组 计算一个班学生四门课程平均分 ************************/#include <stdio.h> #include & ...

  9. mysql文件结构体_MySQL InnoDB文件相关的三个重要结构体

    我们使用mysql常使用innodb存储引擎,它包括两种,一种是innobase,另外一种是innodb plugin.今天主要介绍innodb plugin的file I/O操作,innodb pl ...

  10. 【C语言】考研复试题目集(三)【结构体】

    文章目录 结构体 基本定义 结构体的定义 成员的获取和赋值 共用体(union) 结构体 基本定义 结构体的定义 成员的获取和赋值 #include <stdio.h>void main( ...

最新文章

  1. Windows Phone应用程序政策性约束
  2. opencv中的waitKey(0)不起作用
  3. 全国计算机二级qq闪退,电脑上QQ闪退怎么回事?各个系统版本电脑QQ闪退现象的解决方法介绍...
  4. 零基础自学html5要多久?Web前端学习路线的6点建议
  5. mongodb对数组元素及内嵌文档进行增删改查操作(转)
  6. before和after怎么区分_触发器before和after的区别
  7. 旷视申请赴港IPO:阿里蚂蚁金服持股近30%
  8. [转载]spring使用PropertyPlaceholderConfigurer加载properties文件处理中文乱码
  9. python pickle模块详解
  10. c++采集声卡输出_使用Core Audio实现对声卡输出的捕捉
  11. iOS检测当前设备是否越狱系统
  12. 网站ICP备案是什么呢?
  13. seo站内优化的10点建议及分析处理方案
  14. 电脑硬件升级完全解决方案
  15. Cisco Packet Tracer 配置交换机与路由器静态路由
  16. c语言结构体张三丰,第五次视频我发到网易云课堂上了
  17. Java网络爬虫--一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库
  18. ROS入门学习笔记|话题发布与订阅
  19. 分布式之gossip共识算法分析
  20. IT行业能干到多少岁?

热门文章

  1. linux修改数据库内容命令,linux中的数据库命令
  2. html怎么制作附页,2020-05-26 用html记录word日记
  3. 胜者树与败者树, 多路平衡归并外部排序
  4. Linux 基础学习(笔记)
  5. git设置记住用户名和密码,不用每次都输入
  6. MAX3232连接RS232理论内容
  7. Template 基础篇-函数模板
  8. bfd的文件格式识别
  9. c语言case后加什么,c++ switch语句的使用(case 后面可以跟N个语句)
  10. 字节字双字地址的区别