1、三、结构变量赋值 数组不能彼此赋值,但同类型的结构变量可以彼此赋值。 例如下面程序对结构变量赋值: #include struct person char name20; unsigned long id; float salary; person pr1“Li ming”, 1082422, 5300.0; void main( ) person pr2; pr2=pr1; /assigning pr1 to pr2coutpr2.name“ ”pr2.id“ ”pr2.salarysalary.,在使用指针访问成员时,通常使用箭头操作符“-”。例如:下面程序中,定义了结构指针,通过结构指针
2、访问结构成员。 #include #include struct person char name20; unsigned long id; float salary; ; void main( ) person pr1; person *p; p= ,结果为:Wang ming 12345678 4800.0,如果一个数组的元素是同一种结构类型的变量,那么这种数组称为结构数组。 要定义一个结构数组,必须先定义一个结构类型,然后再定义具有这种结构类型的一个数组。 例如,定义一个包含100个元素的person 结构数组: struct person char name20; unsigned l
3、ong id; float salary; person allone100;,9.3 结构与数组,数组中每个元素是一个完整的结构变量,它包含name、id、salary三个成员分量。 allone0 访问第一个数组元素; allone99访问最后一个数组元素。例如:下面程序对一个person 结构数组中的元素进行“冒泡法”排序,工资高的排在后面。 #include struct person char name20; unsigned long id; float salary; ;,person allone6=“jone”,12345,3390.0, “david”,13916,4490
4、.5, “marit”,27519,3110.0, “jasen”,42876,6230.5, “peter”,23987,4000.2, “yoke”,12335,5110.0;void main( ) person temp; for(int i=1; iallonej+1.salary) /工资高的后移 temp=allonej; allonej=allonej+1; allonej+1=temp; ,for(int k=0;k6;k+) coutallonek.name“ ” allonek.id“ ” allonek.salaryendl;,运行结果为:marit 27519 311
5、0.0jone 12345 3390.0peter 23987 4000.2david 13916 4490.5yoke 12335 5110.0jasen 42876 6230.5,结构变量也可以作为实参数进行函数调用。可以采用传值、传址、传引用的三种方式传递参数。一、传递结构变量值 因为传递的是实参结构变量中拷贝的数值,所以实参结构变量的数值不会因为函数的调用而被修改。例如:下面是一个传值调用的例子 #include struct person char name20; unsiged long id; float saslary; ;,9.4 传递结构参数,void print(pers
6、on pr)coutpr.name“ ”pr.id“ ”pr.salaryendl;person allone4=“jone”,12345,3390.0, “david”,13916,4490.5, “marit”,27519,3110.0, “yoke”,12335,5110.0;void main( ) for(int i=0;itemp.name; couttemp.idtemp.salary; return temp; /返回结构变量tempvoid print(person,void main( ) person employee3; for(int i=0;ips-numberps
7、-score; /结点赋值 head=NULL; /开始时链表为空 pend=ps; while(ps-number!=0) if(head=NULL) head=ps; else pend-next=ps;,pend=ps; /S点 ps=new student; cinps-numberps-score; pend-next=NULL; delete ps; return(head);void showlist(student *head) coutnumberscorenext; void main( ) showlist(greate( );,输入: 结果: 85.0 The item
8、s of list are: 73.0 401, 85.0 91.0 410, 73.0 68.0 425, 91.0 82.0 413, 68.00 0 432, 82.0,在main( )中,把建立链表函数greate( )的返回值head(指向链表指针)作为实参数调用showlist( )函数。,PendPsheadheadpendps,greate( )函数中,链表创建过程如下图所示:,第一次进入循环到达S点:第一次循环结束后:,进入循环之前:,第二次循环到达S点时: head pend ps第二次循环结束时: head pend ps程序结束时:head,NULL,联合是一种与结构相
9、类似的构造类型。联合与结构的主要区别在于,联合类型分量所占内存空间不是各个成员所需存储空间字节数的总和,而是联合成员中所需要存储空间最大的成员所需要的字节数。 编译器规定联合各个成员共享一个公共存储空间。在任何给定的时刻,只能允许一个成员驻留在联合中,而对结构而言,则是所有的成员都一直驻留在结构中。,9.7 联合(Union),定义联合类型的一般形式是: union 联合名 类型 变量名; 类型 变量名; 联合变量名;,例如定义一个名为data 的联合类型和名为data 的结构变量类型: union data struct data char ch; char ch; int num; int
10、 num; long lnum; long lnum; value; value;,其存储空间分配如下:,value,ch,num,lnum,union 中value 变量,共享 4字节,value,ch,num,lnum,struct 中value 变量,下面是一个使用联合变量的程序例子:#include void main( ) union long int ig3; char s12; t; t.ig0=0x 20 49 45 42; t.ig1=0x 47 4e 49 4a; t.ig2=0x 00 00 0a 21; coutt.s;,例中字符串对应的ASCII码 (十六进制)分别为:B E I 空格 J I N G !n,42 45 49 20 4a 49 4e 47 21 0a,结果: BEI JING!,结构是一种用户定义的数据类型,声明结构时,不产生内存的分配,只是在定义结构变量时,才分配内存空间。 结构作为参数进行函数调用时,传值方式是复制实参的值,当结构很大时(很复杂时),宜采用引用传递或传址,仅传递结构变量的地址,提高程序运行效率。 在C+中,结构是类的过渡,类的功能涵盖了结构的一切。因此结构和联合的使用在不断的缩小,他们更多地用在与硬件控制有关的低级程序设计中。 结构的概念是理解各种数据结构的关键,本章介绍的单向链表就是其中之一。,第九章 小结,