结构数组:

  和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数组初始值,第二层的大括号表示数组的每个元素也是结构,结构中又有结构即第三层大括号。总的来说,这种嵌套组合只是复杂了,并不难。

最新文章

  1. UWP学习记录8-设计和UI之控件和模式5
  2. JSP内置对象及常用方法
  3. Linux下面桌面的安装
  4. android测试点汇总
  5. 移动表格行 解决低版本IE fadeIn fadeOut 失效问题
  6. Java线程池应用
  7. .net异常小总
  8. Ember学习(8):REOPENING CLASSES AND INSTANCES
  9. C#快速排序详解
  10. EasyUI-在行内进行表格的增删改操作
  11. java 浅复制 代码
  12. Linux添加新硬盘及分区,格式化,挂载
  13. js cookie 工具
  14. mybatis通用mapper源码解析(二)
  15. 样本稳定指数PSI
  16. WAI-ARIA无障碍网页应用属性完全展示——张鑫旭
  17. MariaDB主从异步复制详解
  18. linux: cmake(未完,待更新)
  19. oracle数据库中修改已存在数据的字段
  20. Mybatis学习随笔

热门文章

  1. RHEL简单管理SELINUX
  2. Spring Security验证流程剖析及自定义验证方法
  3. The Moving Points HDU - 4717
  4. C# wav语音文件合并
  5. C#图解教程 第二十三章 预处理指令
  6. Luogu P1860 新魔法药水
  7. Luogu3444:[POI2006]ORK-Ploughing
  8. IDE-IntelliJ IDEA 主题、字体、编辑区主题、文件编码修改、乱码问题
  9. PHP 接口 返回构造函数
  10. CLOB型转成字符型