听翁恺老师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常量的 ...
随机推荐
- Django学习-22-Form
Form是Django的功能较强的验证组件,负责各种表单验证 input中的name属性值要和form中的字段名相同 from django import forms from django.form ...
- TCP粘包、拆包及解决
TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示 ...
- hdu2242 考研路茫茫——空调教室
弱联通 #include<iostream> #include<cstdio> #include<cstring> #include<map> #inc ...
- .Net利用Newtonsoft进行解析Json的快捷方法
现在异构系统之间的数据交换多采用Json格式 .Net如何快捷地解析Json和将Object转换成json呢? 1.利用Newtonsoft解析Json字符串 在百度上查找资料,利用Newtonsof ...
- Excel2010 日文显示乱码
- 消息中间件kafka+zookeeper集群部署、测试与应用
业务系统中,通常会遇到这些场景:A系统向B系统主动推送一个处理请求:A系统向B系统发送一个业务处理请求,因为某些原因(断电.宕机..),B业务系统挂机了,A系统发起的请求处理失败:前端应用并发量过大, ...
- Splay树简单操作
前几天刚刚自学了一下splay,发现思路真简单实现起来好麻烦 先贴一下头文件 # include <stdio.h> # include <stdlib.h> # includ ...
- [BZOJ1046] [HAOI2007] 上升序列 (dp)
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
- 论文笔记(7):Constrained Convolutional Neural Networks for Weakly Supervised Segmentation
UC Berkeley的Deepak Pathak 使用了一个具有图像级别标记的训练数据来做弱监督学习.训练数据中只给出图像中包含某种物体,但是没有其位置信息和所包含的像素信息.该文章的方法将imag ...
- springboot如何测试打包部署
有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...