听翁恺老师mooc笔记(12)--结构中的结构
结构数组:
和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组。比如下面这个例子:
struct date dates[100];
struct date dates[] = {{4,5,2005},{2,4,2005}};
dates[100]是一个结构数组,其中每个元素是date结构的变量。对dates初始化的时候就需要两层括号,外层大括号是说初始化dates这个数组,里面的每个大括号都是一个数组元素,比如{4,5,2005}是dates[0]的值,{2,4,2005}是dates[1]的值。例如:
#include <stdio.h>
struct time {
int hour;
int minutes;
int seconds;
}; //在main外定义了一个结构体time,包含有小时hour、分钟minutes和秒seconds
struct time timeUpdate(struct time now); //函数参数是struct time类型变量,返回值也是struct time类型
int main(void){
struct time testTimes[5]={ //做了一个名为testTimes的数组,元素个数是5
{11,59,59},{12,0,0},{1,29,59},{23,59,59},{19,12,27} // {19,12,27} 是数组的第4个元素,19是hour,12是minutes,27是seconds
};
int i;
for(i=0;i<5;++i){
printf("Time is %.2i:%.2i:%.2i",testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);
//testTimes[i]是数组的每个单元,而每个单元是一个struct time,所以每个单元可以使用.点得到时分秒成员
testTimes[i] = timeUpdate(testTimes[i]);//testTimes[i]这个结构变量作为参数传递给函数,并接收返回值
printf("...one second later it's %.2i:%.2i:%.2i\n",testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);
}
return 0;
}
struct time timeUpdate(struct time now){ //时间的递增
++now.seconds;
if(now.seconds == 60){
now.seconds = 0;
++now.minutes;
if(now.minutes == 60){
now.minutes = 0;
++now.hour;
if(now.hour == 24){
now.hour = 0;
}
}
}
return now;
}
程序特别之处只是timeUpdate函数的参数和返回值都是struct time类型的变量,没用其他特别的~
结构中的结构:
结构中的成员可以是int、double等,也可以是结构。比如下述例子,如果之前有了date、time,那么就可以定义一个dateAndTime的结构,其中第一个成员变量是sdate,第二个是stime:
struct dateAndTime{
struct date sdate;
struct time stime;
}
再比如下述代码,如果有结构point和rectangle,那么定义struct rectangle变量后,则可以使用.点运算获得变量,每个点的左边都是结构:
struct point{
int x;
int y;
};
struct rectangle{
struct point pt1;
struct point pt2;
};
struct rectangle r;
r.pt1.x;
r.pt1.y;
r.pt2.x;
r.pt2.y;
如果再定义结构指针,那么访问结构成员变量则有四种等价的形式:
struct rectangle r,*rp;
rp=&r;
//访问变量四种形式等价:
r.pt1.x;
rp->pt1.x;
(r.pt1).x;//该括号加不加都没有关系,都是点运算,从左到右运算
(rp->pt1).x;
r和指针rp的关系如下图,r是一个包含有pt1和pt2的结构变量,而pt1和pt2又分别是包含有x和y的结构变量,rp指向r。
结构中结构的数组:
人类对于组合是没有止境的,所以有结构和数组,就可以组合成结构的数组(数组中都是结构),也可以做数组的结构(结构中有数组),也可以做结构中的结构的数组(数组中的单元是结构,结构中还有结构):
#include <stdio.h>
struct point{
int x;
int y;
};
struct rectangle{
struct point p1;
struct point p2;
};
void printRect(struct rectangle r){
printf("<%d,%d>to<%d,%d>\n",r.p1.x,r.p1.y,r.p2.x,r.p2.y);
}
int main(int argc,char const *argv[]){
int i;
struct rectangle rects[]={
{{1,2},{3,4}},
{{5,6},{7,8}}
}; //最外层的大括号表达rect数组,第二层的大括号表示数组的每个元素也就是结构,结构中又有结构第三层大括号
for(i=0;i<2;i++) printRect(rects[i]);
return 0;
}
在main中定义结构中结构的数组rects,包括三层大括号,最外层的大括号表达对rects数组初始值,第二层的大括号表示数组的每个元素也是结构,结构中又有结构即第三层大括号。总的来说,这种嵌套组合只是复杂了,并不难。
听翁恺老师mooc笔记(12)--结构中的结构的更多相关文章
- 听翁恺老师mooc笔记(11)--结构和函数
结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...
- 听翁恺老师mooc笔记(10)--结构
定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...
- 听翁恺老师mooc笔记(15)--文件的输入与输出
<>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...
- 听翁恺老师mooc笔记(4)--指针的应用场景
指针应用场景一:交换两个变量的值 在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值. #inclu ...
- 听翁恺老师mooc笔记(2)-第一个程序--&运算符
使用devC++写hello world 第一步:文件-新建-源代码.然后输入"输出hello world"程序: 注意:写程序时关闭中文输入法,否则语句输入的分号可能会被识别为错 ...
- 听翁恺老师mooc笔记(16)--程序设计与C语言
问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...
- 听翁恺老师mooc笔记(14)--格式化的输入与输出
关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...
- 听翁恺老师mooc笔记(13)--类型定义和联合
typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...
- 听翁恺老师mooc笔记(9)--枚举
枚举类型的定义 用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的 ...
随机推荐
- IIS易混概念小结
IIS连接数 常识: 虚拟主机会限制IIS连接数,关于其含义,差不多每个主机供应商都有一套自己的说法,微软也没有给出很明确的解释: 含义: IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫 ...
- java自带的类压缩和下载,以及递归删除动态的文件(shiro项目中来的十)
详见项目,不用借助于任何外在的jar包,通过jre自带的实现.
- layer与iframe 间值的相互传递
在A页添加 <input id="handle_status" value="" hidden="hidden"> jq代码 l ...
- 在VCS仿真器中使用FSDB[转载]
来源:https://www.cnblogs.com/catannie/p/8099331.html FSDB(Fast Signal Database)是Verdi支持的文件格式,用于保存仿真产生的 ...
- [HDU4812]D Tree
vjudge 题意:给一棵树,每个点上有一个权值,求一条路径使得路径上权值的乘积膜\(10^6+3\)的结果为\(K\),输出路径的两个端点\(x,y\).如有多解,设\(x<y\),输出\(x ...
- 【BZOJ4199】【NOI2015】品酒大会(后缀数组)
[BZOJ4199][NOI2015]品酒大会 题面 BZOJ Uoj 洛谷 题解 考虑最裸的暴力 枚举每次的长度 以及两个开始的位置 检查以下是否满足条件,如果可以直接更新答案 复杂度\(O(n^3 ...
- centos7安装eclipse方法
很多喜欢编程的朋友并不是很喜欢使用Windows来编写程序,尽管可视化编程但是操作相对繁琐,因而只在电脑上装有Linux系统,那么我们来说一下Linux下安装Java EE编程工具eclipse的方法 ...
- easyUI datagrid 多行多列数据渲染异常缓慢原因以及解决方法
原因 最近,在优化之前公司帮联想(外包)做的一个老的后台管理系统,由于项目是基于easy UI框架,页面是后台用jsp实现的,再加上在公司推行前后端分离的实践,大部分项目都基于vue采用前后端分离去实 ...
- Angular4---部署---将Angular项目部署到IIS上
---恢复内容开始--- Angular项目部署到一个IIS服务器上 1.安装URL rewrite组件: 网址:https://www.microsoft.com/en-us/download/de ...
- Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...