资源描述
单击以编辑母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 数组、结构体及联合体,4.1 数 组,一. 数组的概念,构结类型,1.数组具有相同性质的一组数据的有序集合,如: 英语成绩: E1, E2, . E40,计算机成绩: C1, C2, . C40, Ei i=1,2,.,40 表示学号),2. 数组元素数组中的每一项数据。,如: E3 表示第3号学生的英语成绩,下标,元素越多,数组越大,3. 数组的维数下标的项数,Ei i=1,2,.,40 表示学号) 一维数组,scoreij (i=1,2,.,40; j=1,2,3)二 维数组,如:i学号;j学科号(1-英语,2-数学,3-物理,那么:score323号学生的数学成绩,1. 一维数组的定义,表示元素的个数从0开始编号,如:定义,float a10; 即:a0, a1, a2, . , a9,注意:,类型说明符 数组名常量表达式,1. 常为整形,或字符型,2. 不能含有变量,main( ), int n;,scanf(“%d,float en;,.,解决:根据实际情况,选一个稍大的数。,main( ),float e60;,.,类型说明符 数组名常量表达式 ,二. 一维数组的定义与使用,形式,2 . 一维数组元素的引用,1) 不能一次引用整个数组, 只能引用数组元素 。引用多个数组元素时,,常借助于,循环,。,2) 数组元素的使用与一般的变量相似。,3) 数组元素的引用形式:,数组名下标 ,整形常量或整形表达式,例4-1,将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1, 4, 5, 6, 8。,解: a0 a1 a2 a3 a4,1 4 5 6 8,a0 a1 a2 a3 a4 a5,原那么,法一:,#includestdio.h,void main( ),int a10,i,j,t;,printf(“input datdn);,for (i=0; i=9; i+),printf(“a%d=“,i);,scanf(“%d,for(i=0,j=9; i=j; i+,j-),t=ai;,ai=aj;,aj=t;,for(i=0;i=9;i+),printf(“a%d=%d “,i,ai);,法二:借助于另一个数组作缓冲,#includeiostream.h,void main( ),int a10,b10,i,j,t;,cout“input datdn;,for (i=0; i=9; i+),cout“a“iai;,for(i=0; i=9; i+),b9-i=ai;,for(i=0; i=9; i+),ai=bi;,for(i=0;i=9;i+),cout“a“iai“ “;,3. 一维数组的初始化,定义数组时,给数组元素赋初值,1. 给所有元素赋初值,int a10=1,2,3,4,5,6,7,8,9,10;,即:a0=1 a1=2 . a9=10,2. 给局部元素赋初值,int a10=1,2,3;,即:a0=1 a1=2 a2=3 a3=0. a9=0,3. 对所有元素赋初值时,可不指定长度,int a =1,2,3;,即:a0=1 a1=2 a2=3 默认只有三个元素,解# includeiostream.h,main(), int a11;,int i, j, t;,coutinput 10 data:n;,for(i=1; i=10;i+),coutaiai; ,for(i=1;i=9;i+),for(j=i+1;jaj),t=ai; ai=aj;aj=t;,coutthe sorted data:n;,for(i=1; i=10;i+),coutai=aiendl;,4.,一维数组程序举例,例4-2,任意输出10个整数, 从小到大顺序输出.,例4-3,有10,从小到大排列的整数, 从键盘上输入一个整数,要求按大小顺序插入这10个数中,。,解: 设有a10数组,,分三种情况,插入数=a10,插入数介于a0与a10之间,#includeiostream.h,void main( ),int i,j,x,t;,int a11=1,3,5,7,9,11,13,15,17,19;,coutx;,if(x=a9) a10=x;,if(x=0;i-),ai+1=ai;,a0=x;,if(xa0&xa9),for(i=0;ix) t=i; break;,for(j=9;j=t; j-),aj+1=aj;,at=x;,for(i=0;i=10;i+),coutai=aiendl;,1.,定义,类型说明符数组名常量表达式常量表达式;,1). 格式:,例: int a34;,三行四例,a00 a01 a02 a03,a10 a11 a12 a13,a20 a21 a22 a23,另一种理解: flaot a04,a14,a24;,数组名,2).在内存中的存放 “按行存放,a00 a01 a02 a03,a10 a11 a12 a13,a20 a21 a22 a23,a23,a22,a00,a02,a01,.,高,低,3).多维数组的定义,与二维数组的方法相同,如: 三维数组 float b234;,a03,a10,a11,a12,a11,a13,第一行,第二行,三. 二维数组的定义与使用,2. 二维数组的使用与一维数组相似,数组名下标下标,整型表达式,变量,常量,3. 二维数组的初始化,1) . 分组给二维数组赋初值,int a34=1,2,3,4,5,6,7,8,9,10,11,12;,a00 a01 a02 . a22 a23,只能引用数组元素 。引用多个数组元素时, 常借助于,循环,。,2). 对所有元素赋初值(按数组元素的顺序),int a34=1,2,3,4,5,6,7,8,9,10,11,12;,a00 a01 a02 . a22 a23,3). 对局部元素赋初值,int a34=1,5,9;,1 0 0 0,5 0 0 0,9 0 0 0,int a34=1,0,6,0,0,11;,1 0 0 0,0 6 0 0,0 0 11 0,4). 对全部元素赋初值时,第一维(行)长度可以省略,int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,int a34 =1,2,3,4,5,6,7,8,9,10,11,12;,即:4个元素一组,int a 4=1,2,0,10;,1 2 0 0,0 0 0 0,0 10 0 0,4. 二维数组程序举例,注:,常借助于双重循环,例4-4,1 2 3,4 5 6,1 4,2 5,3 6,a=,b=,#includestdio.h,voidmain(),int a23=1,2,3,4,5,6, b32, i, j;,printf(“Array a :n);,for(i=0;i2;i+),for(j=0;j3;j+),printf(“% d,aij);,printf(“n);,for(i=0;i2;i+),for(j=0;j3;j+),bji=aij;,printf(“Array b :n);,for(i=0;i3;i+),for(j=0;j2;j+),printf(“% d,bij);,printf(“n);,for(i=0;i2;i+),for(j=0;j3;j+),printf(“% d,aij);,bji=aij;,printf(“n);,也可以,将3*4矩阵,按行排序(从小到大)存放,2 1 4 3,10 11 8 7,6 5 12 9,1 2 3 4,5 6 7 8,9 10 11 12,解:,2维,1维,排序,2维,1维,一维序号=行号*列数+,列号,二维行号= 一维序号/ 列数,二维列号= 一维序号% 列数,例4-5,# includeiostream.h,void main(),int a34=2,1,4,3,10,11,8,7,6,5,12,9;,int b12,i,j,t;,for(i=0;i3;i+),for(j=0;j4;j+),bi*4+j=aij;,for(i=0;i=10;i+),for(j=i+1;jbj),t=bi;,bi=bj;,bj=t;,for (i=0;i=11;i+),ai/4i%4=bi;,for(i=0;i3;i+),for(j=0;j4;j+),coutaij ;,coutendl;,法二:,# includeiostream.h,main(),int a34=2,1,4,3,10,11,8,7,6,5,12,9;,int i,j,t;,for(i=0;i=10;i+),for(j=i+1;jaj/4j%4),t= ai/4i%4;,ai/4i%4 aj/4j%4,aj/4j%4 =t;,for(i=0;i3;i+),for(j=0;j4;j+),coutaij ;,coutendl;,打印扬辉三角形。打印10行,1,1,1,1,2,1,1,3 3,1,1,4 6 4,1,1,5 10 10 5,1,.,# includeiostream.h,# includeiomanip.h,void main(),int a1010, i, j;,for(i=0;i=9;i+),ai0=1;,aii=1;,for(i=2;i=9;i+),for(j=1;j=(i-1);j+),aij=ai-1j-1+ai-1j;,for(i=0;i=9;i+),for(j=0;j=i;j+),coutsetw(5)aij;,coutendl;,例4-6,存放字符的数组;每一个元素存放一个字符,1. 字符数组的定义,一维字符数组,二维字符数组,例:,char a12;,a0=I ; a1=t; a2= ; a3=i; a4=s a5= ; a6=a;,a7= ; a8=b; a9=o ; a10=o; a11=k;,I,t,i,s,a,b,o,o,k,a0 a1 a2 . a10 a11,注:字符型与整型通用, char a10; int a10;,等价,char 数组名常量表达式;,char 数组名常量表达式 常量表达式;,四. 字 符 数 组,2. 字符数组的初始化,与数值型数组相似,一维:,二维,char a12=I, t, , i, s, , a , b, o, o, o, k ,char a33= , , ,*, , ,*, ,*, ,*, , ,*, ,*,char a3= , , ,*, , ,*, ,*, ,*, , ,*, ,*,等价,3. 字符数组的引用,与数值型数组相似,只能引用元素单个字符,不能引用整个数组,借助于循环,例7.7,输出一个钻石图形,# include “iosteam.h,void main(),char diamond5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,* ;,int i,j;,for(i=0;i5;i+), for(j=0;j5;j+),coutdiamondij;,cout字符串长度;,2. 数组中放的是字符还是字符串, 关键看最后一个元素,为0 那么为字符串,不为0 那么只能是假设干个字符,字符数组,多个元素(字符),最后一个元素 赋为,0,5. 字符数组的输入输出,两种方法,1.,对字符数组中的每一个元素,逐一输入、输出。采用循环实现,。,2.,以字符串的形式,对整个字符数组输入、输出,。,1). 逐个输入、输出单个字符与引用数组元素相同,例:输入一段文字,转换成大写输出。,#include“stdio.h,void main(),char ch200;,int i,j;,for(i=0;(chi=getchar()!=n;i+),if (chi=a&chi=z),chi=chi-32;,for(j=0;j=i-1;j+),putchar(chj);,putchar(n);,2). 对整个字符串输入、输出采用 cin cout,scanf(“%s,.)、printf(“%s,.),(1),输出,:,结果,:It is a book,例2 char a=c, h,i, 0, n, a, 0, 0;,printf(“%s, a);,或: char a13=I, t, , i, s, , a , , b, o, o, k, 0 ;,printf(“%s, a);,例1: char a=“It is a book;,printf(“%s, a);,注意:用数组名,结果,:chi,输出至第一个0结束,用printf(“%s,数组名),注意:用数组名,注意:用数组名,用cout,数组名,char a=“It is a book;,couta;),输入:china,输入不能超过5个字符,a0 a1 a2 a3 a4 a5,c,h,a,i,n,0,自动加0,例: char a20;,scanf(“%s,a);(或:cina;),输入:How are you?,H,o,w,0,a0 a1 a2 a3 . a19,遇“空格认为输入结束,自动加0,%s,格式默认两种情况表示输入完成: 1)回车, 2)空格,cin,数组名,或,6. 字符串处理函数,1). 字符串输出函数 puts( ),puts(字符串/字符数组名,2). 字符串输入函数 gets( ),gets(字符数组名,注: 以回车键作为输入结束,故字符串中可含有空格,程序开头用“文件包含命令:,#include“stdio.h,3). 字符串连接函数 strcat( ),strcat(字符数组1,字符串或字符数组2,4). 字符串拷贝函数,strcpy( ),strcpy(,字符数组名1,字符串或字符数组名2),后者内容替代前者内容。常用于字符串赋值,前者+后前 放入前者中,程序开头用“文件包含命令:,#include“string.h,5). 字符串比较函数 strcmp( ),strcmp(字符串1或字符数组名1,字符串2或字符数组名2 ,规那么:1从左至右,逐个字符比较,直到出现不同字符或0为止,2结果: 第一个不相同字符的ASC 码之差,串1=串2 结果=0,串1串2 结果0,串1串2 结果a,结果为:105-97=8,6). 测字符串长度函数 strlen( ),strlen(字符串或字符数组名,求字符串的长度不包括0),7). strlwr(字符串),将字符串中的大写字母变成小定字母,8). strupr(字符串,),将字符串中的小写字母变成大定字母,程序开头用“文件包含命令:,#include“string.h,7. 字符数组应用举例,编写一个程序, 将两个字符串连接起来,不用strcat函数。,A,B,0,D,C,E,F,0,H,G,#includeiostream.h,# include stdio.h,void main(),int i,k;,char s120,s210;,cout“input string s1: n;,gets(s1);,cout“input string s1: n;,gets(s2);,for (i=0; s1i!=0;i+) ;,k=i;,for (i=0; s2i!=0;i+),s1k+i=s2i;,s1k+i=0;,puts(s1);,s1,s2,为什么这样做?,解:,例4-8,例4-9 对一组姓名设为6个按字母大小排序A Z或a z,解:,一个姓名由多个字符组成,故用字符数组表示,多个姓名由二维字符数组表示,# incudeiostream.h,#include“string.h,main(),char n630=“Li,“Zhang,“Zheng,“Huang,“Jiang,“Zhao;,char t30;,int i,j;,for (i=0;i=4;i+),for(j=i+1;j0),strcpy(t,ni);,strcpy(ni,nj);,strcpy(nj,t);,for(i=0;i=5;i+), coutni;,couty) flag=1;,else if (xy) flag=-1;,else flag =0;,rerurn (flag);,voi main(),int large (int ,int);,int a10,b10,i,n,m,k;,n=m=k=0;,cout“input array a:n;,for(i=0;iai;,cout“input array b:n;,for(i=0;ibi;,for(i=0;i=9;i+),if(large(ai,bi)=1) n+;,else if(large(ai,bi)=0 m+;,else k+;,cout“ l,m,k=“n,m,kk) coutarray bn;,if (nk) cout“ array aarray bn;,if (m=9) couty 结果: 1,如:xy 结果: -1,x=y 结果: 0,统计:大于、小于、等于的次数,(大于的次数),(等于的次数),(小于的次数),五. 数组作函数参数,2.,数组名作为参数的参数,第8章第7节,被调用函数中: 形参 数组名,主调函数中: 实参 数组名,传值内容:,传整个数组。即将数组中的所有元素,从主调函数传给被调用函数。,例4-11,*求一个数组前n,个元素的平均值。,#includeiostream.h,float average( float a, int m),int i;,float aver,sum=0.0;,for(i=0;i=m-1;i+),sum=sum+ai;,aver=sum/m;,return(aver);,void main(),float average(float a,int m);,float score10,ave;,int i,n;,cout“input array an;,for(i=0;i=9;i+),cout“score“iscorei;,coutn;,ave=average(score,n);,cout“ave=“aveendl;,函数声明,函数调用,第8章第7节,几点注意,1). 主调函数和被调用函数中均定义数组, 类型一致;,2).元素个数, 可以相同或不一致,要求: 实参数组元素个数形参数组元素个数,3). 形参数组可以不指定元素个数, 以增加通用性;,4).传数值的方式,传递地址。,传递地址,数组名是数组的首地址第一个元素在内存所占单元的编号,用数组名作函数参数,相当于:,实参数组首地址,形参数组首地址,故:,传,实参数组各个元素,形参数组各个元素,1000,1001,1002,1003,1004,1005,1006,1007,.,score0,score1,score2,score9,a0,a1,a2,a9,低地址,高地址,内存单元地址,首地址,共占相同的内存单元,结论:,形参数组元素值的改变 实参数组元素值,影响,第8章第7节,例4-12,写一个函数,使输入一个字符串反序存放,在主函数中输入输出字符串。,# include “stdio.h,# include “string.h,void f(char a),int i,j,k;,char b;,i=j=0;,while(ai!=0),i+;,k=i-1;,for(i=0, j=k; ij;i+,j-), b=ai; ai=aj;aj=b;,void main(),void f(char a);,char b30;,printf(“input a srting :n);,gets(b);,f(b);,printf(“resulte is:n);,puts(b);,为什么?,3.,多维数组作参数的参数,1). 多维数组的元素作函参数,被调用函数中: 形参用变量,主调函数中: 实参用数组元素,2). 数组名作函参数,被调用函数中: 形参 数组名,主调函数中: 实参 数组名,与一维数组相似,注:(1). 被调用函数中,定义函数时,形参数组的第一维大小可省略;,int max_value (int array 4),省略,(2). 实参数组元素个数形参数组元素个数,例4-13 写一个函数,使给定的一个二维数组33转置,即行列互换。,# include iostream.h,# includeiomanip.h,void f(int a33),int i,j,b;,for (i=0;i=2;i+),for(j=0;,ji,;j+), b=aij;,aij=aji;,aji=b;,注意!,viod main(),int c3=1,2,3,4,5,6,7,8,9;,int i,j;,coutsource array is:n;,for(i=0;i=2;i+), for(j=0;j=2;j+),coutsetw(5)cij;,coutendl;,f(c);,coutresulte is:n;,for(i=0;i=2;i+), for(j=0;j=2;j+),coutsetw(5)cij;,coutendl;,整型,实型,字符型,枚举型,根本数据类型,只能定义单一的数据种类,在实际应用中,希望将这些根本类型根据某种需要, 组成一个整体, 从而得到一种新的数据类型。 结构体类型,采用,结构体(类型)由根本数据类型,组合而成的一种数据类型。,如:要表示学生的情况,学号 num 10010 (int),姓名 name Liming (char),性别 sex M (char),年龄 age 18 (int),分数 score 90.0 (float),10010,Liming,F,18,90.0,结构体类型的定义,struct,结构体名, 类型符 成员名1;,类型符 成员名2;,.,类型符 成员名n;,形式,注:,1)结构体、成员的命名规格与变量相同;,2) “成员又名“分量或“域,4.2 结 构 (体),一.概 述,例,:,struct,student, int,num,;,char,name30,;,char,sex,;,int,age,;,float,score,;,结构体名(,是类型名,而非变量名,),成员名,三种方法,1). 先定义结构体类型, 再定义变量,struct student, int num;,char name30;,char sex;,int age;,float score;,;,student stu1, stu2;,分号不能少,定义结构体类型,变量名,类型名,二.,结构体类型变量的定义,2. 同时定义,struct,student, int num;,char name30;,char sex;,int age;,float score;,stu1, stu2;,变量名,类型名,无分号,3. 直接定义,struct, int num;,char name30;,char sex;,int age;,float score;,stu1, stu2;,无类型名,变量名,说明:,1). 注意,结构体类型,与,结构体变量,的不同含义;,student,stu1,stu2,;,int,a, b,;,比较,2). 结构体的成员可以是另一个结构体类型;,即: 结构体中又包含结构体,3). 成员名与程序中其他变量同名时, 互不干抚。,下一页,age,exame,English,Math,sex,name,num,如:,struct,score,float english;,float math;,struct student,int num;,char name30;,char sex;,int age;,score,exame;, stu1,stu2;,struct student,int num;,char name30;,char sex;,int age;,float,exame2,;, stu1,stu2;,或:,定义类型,使用已定义的结构体,1. 引用原那么,只能引用成员,不能引用整个结构体变量,方法,:,结构体变量名. 成员名,成员运算符。优先级最高,左结合,例如:,stu1. num ,引用结构体变量stu1中的成员num,2. 使用,结构体变量中成员的使用与一般的变量或数组相同。,stu2. score=stu1.score; strcpy (stu2.name, stu1.name);,sum=stu1.score+stu2.score;,三.,结构体类型变量的引用,特例,: 具有相同结构的两个结构体变量可整体赋值,stu2=stu1;,stu2.num stu1.num,stu2.name stu1.name,.,stu2.score stu1.score,相当于,3. 成员又是结构体类型,只能引用最低级别的成员,例:,ave= (,stu1,.,exame,.,english,+,stu2,.,exame,.,english,)/2.0;,struct,score,float english;,float math;,struct student,int num;,char name30;,char sex;,int age;,score,exame;, stu1,stu2;,在定义结构体变量时赋初值,struct student, int num;,char name30;,char sex;,int age;,float score;,student stu1=1001,“Liming,M,18, 90.0,例1,例2,struct student, int num;,char name30;,char sex;,int age;,float score; stu1=1001,“Liming,M,18, 90.0;,例3,struct, int num;,char name30;,char sex;,int age;,float score; stu1=1001,“Liming,M,18, 90.0;,注意:,初始值的顺序、类型与成员要一致,分开定义时赋初值,同时定义时赋初值,直接定义时赋初值,四.,结构体类型变量的初始化,数组中的每一个元素都属于同一种类型的结构体,1. 结构体数组的定义,第1种方法,struct student, int num;,char name30;,char sex;,int age;,float score;,;,student,stu10,;,struct student, int num;,char name30;,char sex;,int age;,float score;,stu10;,struct, int num;,char name30;,char sex;,int age;,float score;,stu10;,第2种方法,第3种方法,2. 结构体数组的初始化,定义结构体数组时,给各元素的成员赋初值,struct student, int num;,char name30;,char sex;,int age;,float score;,student stu10=1001,“Liming,M,18, 90.0,1002,“wangfan,F,18,87.5;,.,;,多种方法,五.,结构体类型数组,struct student, int num;,char name30;,char sex;,int age;,float score; stu10=1001,“Liming,M,18, 90.0;,1002,“wangfan,F,18,87.5;,.,;,3,.,结构体数组的使用,1)符合数组引用方法: 只能引用元素,2)符合结构体变量的引用原那么: 只能引用成员,例4-14 10个学生, 每个学生包括学号、姓名、3门课的分数,,求:1全班每门课的学科平均分;,2找出成绩最好平均成绩的学生,输出姓名、学号、各科分,数和平均分,英语,C程序,数学,90,70,82,82,64,75,70,78,85,.,.,.,ave0,ave1,ave2,stu0,stu1,stu2,.,(90+70+82)/3.0=80.7,(82+64+75)/3.0=73.7,(70+78+85)/3.0=77.7,.,学生平均分,科目平均分,# includeiostream.h,void main(),srtuct student,int num;,char name30;,float score3;,;,student stu10;,float ave3, aves,int i,j,k;,for (i=0;i10;i+),cout“input data of No. “ iendl;,cinstui.num stui.namestui.score0stui.score1stui.score2;,ave0=0.0; ave1=0.0; ave2=0.0;,for(i=0; i10; i+),for(j=0;j3;j+),avej=avej+stui.scorej;,ave0=ave0/10.0; ave1=ave1/10.0; ave2=ave2/10.0;,定义结构体数组,输入数据,求各科平均分,aves=(stu0.score0+stu0.score1+stu0.score2)/3.0;,k=0;,for (i=0; iaves),aves=(stui.score0+stui.score1+stui.score2)/3.0;,k=i;,cout“average= ave0, ave1, ave2;,cout“the data of student with maxium average score “stuk.num stuk.name, stuk.scoe0stu uk.scoe1 stuk.scoe2;,第11章第5节,求最高分数的学生位置k,第11章第6节,六.,结构体类型数据作函数参数,1). 用成员作函数参数与一般变量相同;,2). 用结构体变量(数组)作函数参数传数值(所有的成员值),编写一个函数print,打印一个学生的成绩数组,该数组中有5 个学生的数据记录,每个记录包括num、name、score3, 用主函数输入这些记录,用print函数输出这些记录。,#include“iostream.h,# include “stdio.h,struct student,int no;,char na30;,float s3;,void main(),void print(student stu, int n);,student stu5;,int i, j;,for(i=0; i=4; i+),cout“input data of No. %d stui.no stui.na ,print (stu, 5);,void print ( student stu, int n),int i, j;,for(i=0; i=n-1; i+),cout“input data of No. %d i;,coutstui.no stui.na stui.s 0 stui.s1 stui.s2;,在函数外定义结构体,所有的函数均可使用,用数组名作函数参数,传整个结构体数组中的元素及成员,本方法是用结构体数组名作函数参数,例,4-15,4.3 联合体(共用体),一.,共用体的概念,1. 什么是共用体,将多种类型数据, 放在起始位置(首地址)相同的一段存贮单元, 即多种数据共用一段内存。(但同一时刻,只能放一种类型的数据 ),2. 共用体类型及共用体变量的的定义,2).,同时定义,union,共用体名,成员表列,变量表列;,union,data,int i;,char ch;,float f;,a,b,c,;,3). 直接定义,union,int i;,char ch;,float f;,a,b,c,;,union,成员表列,变量表列;,1).,分开定义,(先定义类型,后定义变量),union,共用体名,成员表列,;,共用体名 变量表列;,union,data,int i;,char ch;,float f;,;,data,a,b,c,;,3. 共用体类型与结构体类型的区别,结构体, 多种类型数据的组合,成员同时存在;,一个结构体变量占内存:成员字节总和。,共用体, 成员不同时存在,某一时刻只有一个成员占用内存。,一个共用体变量占内存:成员中最长字节,union,data,int i;,char ch;,float f;, a,b,c;,struct,data,int i;,char ch;,float f;, x,y,z;,占字节数:2+1+4=7字节,占字节数:max2,1,4=4字节,二. 共用体变量的引用,只能引用成员,不能引用共用体变量,cout,a.i,;,cout,a,三. 共用体类型数据的特点,1. 某一时刻只能放一种数据;并且是最近一次放入的数据。,2. 共用体变量和各成员的地址相同;,3. 共用体变量不能初始化,union, int i;,char ch;,float f;,a=1,a,1.5,4. 共用体变量不能用作 函数参数新标准可以,5. 可以定义共用体数组,union, int i;,char ch;,float f;,a10;,6. 共用体、结构体可以嵌套,共用体中包含结构体;,结构体中包含共用体。,四. 共用体的应用,1. 同一个数据区间,根据不同的情况,存放不同类型的数据。,例,4-16,教师数据: 身份证号,姓名,性别,职业,工资,学生数据: 身份证号,姓名,性别,职业,班级,类型不同,整型数,字符串,# includeiostream.h,struct p,char c20;,char na30;,char sex;,char job;,union int w;,char cla20; ca;,;,void main(), struct p m2;,int i; float f;,coutinput data: ;,for(i=0; imi.cmi.na,if(mi.job=t| mi.job=T),cinmi.ca.w;,else cinmi.ca.cla;,for(i=0; i2; i+),coutm
展开阅读全文