结构数组:

  和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)--结构中的结构的更多相关文章

  1. 听翁恺老师mooc笔记(11)--结构和函数

    结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...

  2. 听翁恺老师mooc笔记(10)--结构

    定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...

  3. 听翁恺老师mooc笔记(15)--文件的输入与输出

    <>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...

  4. 听翁恺老师mooc笔记(4)--指针的应用场景

    指针应用场景一:交换两个变量的值 在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值. #inclu ...

  5. 听翁恺老师mooc笔记(2)-第一个程序--&运算符

    使用devC++写hello world 第一步:文件-新建-源代码.然后输入"输出hello world"程序: 注意:写程序时关闭中文输入法,否则语句输入的分号可能会被识别为错 ...

  6. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  7. 听翁恺老师mooc笔记(14)--格式化的输入与输出

    关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...

  8. 听翁恺老师mooc笔记(13)--类型定义和联合

    typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...

  9. 听翁恺老师mooc笔记(9)--枚举

    枚举类型的定义 用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的 ...

随机推荐

  1. hdu5904 LCIS

    这题惩罚我这种经常不管常数的懒人 直接 1e6 TLE 如果1e5对数组枚举过 诶其实很想吐槽些伤心事,但是还是不想在博客上吐口水 不管今年比赛结果如何 请享受比赛 #include<bits/ ...

  2. Hibernate【缓存】知识要点

    对象状态 Hibernate中对象的状态: 临时/瞬时状态 持久化状态 游离状态 学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础...当然啦,也就 ...

  3. java实现中文分词

    IK Analyzer是基于lucene实现的分词开源框架 下载路径:http://so.csdn.net/so/search/s.do?q=IKAnalyzer2012.jar&t=doc& ...

  4. 【Luogu2444】病毒(AC自动机)

    [Luogu2444]病毒(AC自动机) 题面 洛谷 题解 如果存在一个无限长的串 证明可以在\(AC\)自动机上找到一个环 然后在上面可以无限跳 所以构建\(AC\)自动机 在上面跑\(dfs\)就 ...

  5. 【POJ2387】Til the Cows Come Home (最短路)

    题面 Bessie is out in the field and wants to get back to the barn to get as much sleep as possible bef ...

  6. Django入门-通用视图

    文档:https://docs.djangoproject.com/en/1.11/topics/class-based-views/ from django.shortcuts import get ...

  7. Filter的过滤链理解

    一.Filter过滤链 web.xml配置了filter过滤器,在容器启动的时候执行了init()方法进行了初始化,然后在容器关闭的时候执行了destroy()方法销毁过滤器,在每次服务器接受请求的时 ...

  8. ORM Basic

    ORM即object relational mapping 对象关系映射程序,可以在操作数据库的时候使用自有的语言而不必使用数据库的语言. 在python中,最强大的ORM框架就是SQLAlchemy ...

  9. 我对asp.net运行机制的理解

    有一本书叫<asp.net 本质论>,作者名叫冠军.我看了几次,都没有坚持看下来.这次连续看完了前三章,然后参考网上的资料,总结下我对.net运行机制的理解. 先上两张图: 看着这两张图, ...

  10. 大数据(2):基于sogou.500w.utf8数据hive的实践

    一.环境的搭建 1.安装配置mysql rpm –ivh MySQL-server-5.6.14.rpm rpm –ivh MySQL-client-5.6.14.rpm 启动mysql 创建hive ...