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

原文地址:https://www.cnblogs.com/c-programing-language/p/6637040.html