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

  • 相关阅读:
    B. Xor of 3 题解(思维+构造)
    小 L 与 GCD 题解(数学 hard)
    F. Clear The Matrix 题解(状压dp)
    小顶堆与大顶堆的自定义cmp函数
    字符指针、字符数组
    python中创建dict对象
    中缀表达式转后缀表达式
    vue中keep-alive,include的缓存问题
    vue 冒号 :、@、# 是什么意思? v-bind v-on v-slot v-是指令
    vue 自定义指令 v-
  • 原文地址:https://www.cnblogs.com/c-programing-language/p/6637040.html
Copyright © 2011-2022 走看看