《构造数据类型》PPT课件.ppt

上传人:tia****nde 文档编号:12733991 上传时间:2020-05-20 格式:PPT 页数:115 大小:806KB
返回 下载 相关 举报
《构造数据类型》PPT课件.ppt_第1页
第1页 / 共115页
《构造数据类型》PPT课件.ppt_第2页
第2页 / 共115页
《构造数据类型》PPT课件.ppt_第3页
第3页 / 共115页
点击查看更多>>
资源描述
第5章构造数据类型,C+语言程序设计教程第5章构造数据类型,制作人:沈显君,第5章构造数据类型,1.掌握枚举类型的使用;2.深入理解数组的概念,掌握数组应用的一般方法;3.深入理解指针的概念,掌握指针的使用;4.注意指针与数组的区别,会使用多重指针以及指针与数组的多种混合体,会分配动态数组;5.理解字符串的概念,会使用字符串;6.理解引用的概念,掌握引用型函数参数的用法;7.掌握结构与联合类型的使用,并注意二者的区别。,学习目标,C+语言程序设计教程第5章构造数据类型,5.1枚举类型,1.枚举类型的定义:“枚举”是指将变量所有可能的取值一一列举出来,变量的取值只限于列举出来的常量。枚举类型的声明的一般形式如下:枚举类型名以及枚举常量为标识符,遵循标识符的取名规则。在定义一个枚举类型时,定义了多个常量,供枚举类型变量取值,称此常量为枚举常量。当没给各枚举常量指定值时,其值依次默认为0、1、2、;在定义枚举类型时,也可使用赋值号另行指定枚举常量的值。,enum枚举类型名枚举常量1,枚举常量2,枚举常量n;,枚举!,C+语言程序设计教程第5章构造数据类型,5.1枚举类型,枚举类型的定义:例1:enumweekdaySUN,MON,TUE,WED,THU,FRI,SAT;定义了7个枚举常量以及枚举类型weekday。枚举常量具有默认的整数与之对应:SUN的值为0、MON的值为1、TUE为2、SAT为6。例2:enumcityBeijing,Shanghai,Tianjin=5,Chongqing;枚举常量Beijing的值为0,Shanghai的值为1,Tianjin的值指定为5。对于指定值后面的没有指定值的枚举常量,编译器会将前一个常量值加1(下一个整数)赋给它,所以Chongqing的值为6。,C+语言程序设计教程第5章构造数据类型,5.1枚举类型,枚举类型的定义说明:枚举类型定义了以后就可以使用枚举常量、使用用枚举类型来定义变量,定义枚举变量的方法与定义其它变量的方法一样。例如:enumcitycity1,city2;citycity1,city2;用两种方法定义了city1、city2两个枚举类型的变量名。枚举类型变量也可以在定义枚举类型的同时定义例如:enumcityBeijing,Shanghai,Tianjin=5,Chongqingcity1,city2;在定义枚举类型的同时定义枚举类型变量可以省略枚举类型名例如:enumBeijing,Shanghai,Tianjin=5,Chongqingcity1,city2;在定义变量时,可以顺便给出初值,若不给初值,默认初值为随机的无意义的数。,C+语言程序设计教程第5章构造数据类型,5.1枚举类型,枚举类型的使用:用枚举类型建立枚举变量后就可以对枚举变量实施赋值以及进行其它运算了,对枚举变量进行赋值,其值要求为同一枚举类型。否则,在编译时出错。例如:weekdayd1,d2,d3,d4;d1=SUN;d2=6;/错误d3=Shanghai;/错误其中对d2所赋之值是整数6,不是枚举常量;可以采用将一个整型值强制转换成同类型的枚举常量赋给枚举变量:枚举常量、枚举类型的变量可进行算术运算、关系运算。对枚举类型实施算术、关系运算时,枚举值转换成整型值参加运算,结果为整型值。所以,如果要将结果赋给枚举变量,还要将结果转换成枚举值。例如:d1=d1+2;/是错误的,因为结果为int型。需要将它强制转换成枚举型:d1=(weekday)(d1+2);,C+语言程序设计教程第5章构造数据类型,5.1枚举类型,枚举类型的使用:枚举常量、枚举类型的变量可直接进行各种形式的关系运算。例如:if(city1=3);if(city2=Beijing);if(Shanghai=1);if(city1SUN);枚举类型变量不能直接进行输入例如:cind1;/错误,C+语言程序设计教程第4章函数,注意:枚举常量是常量,不是变量,所以不能对枚举常量进行赋值。例如:在上例中不能进行赋值Shanghai=Beijing;枚举常量的值不是列举的字符串,其值为整数。编译器对赋给枚举变量的对象(数)进行类型检查,如类型不相符则发出警告。当类型相同,而值超出此类枚举类型枚举常量范围时,也是正常的。,C+语言程序设计教程第5章构造数据类型,【例5-1】输入城市代号,输出城市名称。,5.1枚举类型,运行结果:Inputacitynumber(-1toexit):1Shanghai8Invalidcitynumber!-1,C+语言程序设计教程第5章构造数据类型,5.1枚举类型,5.2数组,数组:数组是一组在内存中依次连续存放的、具有同一类型的数据变量所组成的集合体。其中的每个变量称为数组元素,它们属于同一种数据类型,数组元素用数组名与带方括号的数组下标一起标识。数组可以是一维的,也可以是多维的。特点:若干个同类型的数据元素,并且各个数据元素之间存在某种次序关系。这类数据有一个共同的特点:它们有若干个同类型的数据元素,并且各个数据元素之间存在某种次序关系。,C+语言程序设计教程第5章构造数据类型,5.2.1一维数组定义与使用,一维数组定义的一般形式为:说明:数组元素的类型可以是void型以外的任何一种基本数据类型,也可以是已经定义过的构造数据类型;数组名是用户自定义的标识符,用来表示数组的名称,代表数组元素在内存中的起始地址,是一个地址常量。常量表达式必须是unsignedint类型的正整数。表示数组的大小或长度,也就是数组所包含数据元素的个数。是数组下标运算符,在数组定义时用来限定数组元素的个数。,数据类型数组名常量表达式;,C+语言程序设计教程第5章构造数据类型,注意:数组属于构造数据类型,在使用之前必须先进行类型定义。,5.2.1一维数组定义与使用,数组元素的类型可以是void型以外的任何一种基本数据类型,也可以是已经定义过的构造数据类型;例如:下面定义了2个不同类型的数组:inta5;/定义了一个5个元素的整型数组aweekdayb10;/定义了一个10个元素的枚举数组b,weekday为已定义的枚举型。数据类型相同的多个数组可以在同一条语句中予以定义。例如:inta110,a220;/同时定义了两个整型数组数据类型相同的的简单变量和数组也可以在一个语句中定义。例如:intx,a20;/同时定义了一个整型变量和一个整型数组,C+语言程序设计教程第5章构造数据类型,5.2.1一维数组定义与使用,数组定义之后,系统会将从内存中为其分配一块连续的存储空间,从第1个数据元素开始依次存放各个数组元素。例如,定义的数组a其内存排列(分配)示意图如图5-1所示。例如:inta5;/定义了一个5个元素的整型数组a,C+语言程序设计教程第5章构造数据类型,5.2.1一维数组定义与使用,一维数组初始化:是指在定义数组的同时给数组中的元素赋值。其一般语法形式为:初值1,初值2,初值n称为初值表,初值之间用逗号,分隔,所有初值用括起来。初值可以是一个变量表达式,初值与数组元素的对应关系是:初值i给数组第i个元素;所以,初值个数n不能超过数组的大小。若初值表中初值个数(项数)小于数组的大小,则未指定值的数组元素被赋值为0;但初值表中项数不能为0。例如:weekdayb10=MON,WED,FRI;当对全部数组元素赋初值时,可以省略数组的大小,此时数组的实际大小就是初值列表中初值的个数。例如:charstr=a,b,c,d,e;/数组str的实际大小为5。在函数中定义数组时,如果没有给出初值表,数组不被初始化,其数组元素的值为随机值;在函数外定义数组如果没有初始化,其数组元素的值为0。数组初值表的可以用一个逗号结尾,其效果与没有逗号一样。,数据类型数组名常量表达式=初值1,初值2,初值n;,C+语言程序设计教程第5章构造数据类型,5.2.1一维数组定义与使用,对一维数组实施的存取操作有两类:存取数组元素与读取数组元素的地址。数组元素是通过数组名及下标来标识的,这种带下标的数组元素也称为下标变量,下标变量可以象简单变量一样参与各种运算。存取一维数组元素的一般语法形式为:说明:下标表达式可以是变量表达式,用来标识数组元素;不同于数组定义时用来确定数组长度的常量表达式。当定义了一个长度为n的一维数组a,C+规定数组的下标从0开始,依次为0、1、2、3、n-1。对应的数组元素分别是a0、a1、an-1,因此下标表达式的值要在0,n-1范围内。例如:a1+2=100;/将数组a的第4个元素赋值100。,数组名下标表达式;,C+语言程序设计教程第5章构造数据类型,5.2.1一维数组定义与使用,【例5-2】学生成绩排序。分析:学生成绩由键盘输入,当输入一个负数时,输入完毕。采用直观的“选择排序法”进行排序,基本步骤如下:将a0依次与a1an-1比较,选出大者与a0交换;最后a0为a0an-1中最大者;将a1依次与a2an-1比较,选出大者与a1交换;最后a1为a1an-1中最大者;同理,从i=2到i=n-1,将ai依次与ai+1an-1比较,选出较大者存于ai中。,C+语言程序设计教程第5章构造数据类型,C+语言程序设计教程第5章构造数据类型,运行结果:80909570-195908070,C+语言程序设计教程第5章构造数据类型,5.2.1一维数组定义与使用,4.数组的地址数组元素的地址通过数组名来读取,其格式如下:由于其地址不是实际的地址值,称这个地址表达式为符号地址表达式。例如:一维数组元素a5的符号地址表达式为a+5。若a是一个int型数组,数组的符号地址表达式a+n所表达的地址是第n+1个元素an的地址,代表的实际地址值为:a+n*sizeof(int)而不是:a+n。,C+语言程序设计教程第5章构造数据类型,数组名+整型表达式;,5.2.1一维数组定义与使用,C+语言程序设计教程第5章构造数据类型,使用数组要注意:在使用数组时最常犯的错误是下标越界,所谓的下标越界就是下标表达式的值超出了数组定义时给定的元素个数,对于这种错误,编译器无法知道,往往在运行时出错。因此在程序设计时应格外注意。数组名是一个地址常量,不能作为左值(赋值的目标)。因此,不能将一个数组整体拷贝给另外一个数组。例如:inta5,c5,i;a=c;/错误!正确的方法是将对应的元素进行拷贝,见下列程序段:for(i=0;i*(p+i);coutn您输入的数据是:endl;for(i=0;i10;i+)cout*(a+i)*p;p=a;q=a+9;while(pq)t=*p;*p=*q;*q=t;p+;q-;cout新的数组是:;for(p=a;pa+10;p+)cout*pt;,2.已知某数组中的值在0-9范围内,统计每个整数的个数。,#includeusingnamespacestd;voidmain()inta100;inti,t;for(i=0;i100;i+)ai=abs(ai%10);/初始数值都不确定,先用一下cout数组的值是:endl;for(i=0;i100;i+)if(i!=0,5.3指针,3指针的初始化与赋值定义了一个指针,只是得到了一个用于存储地址的指针变量。若指针变量既没有初始化,也没有赋值,其地址值是一个随机的数。(1)不要将一个非地址常量、变量以及无意义的实际地址赋给指针变量。如:int*p=100;/错误,100是一个int型常量,不是一个地址常量。int*p=(char*)100;/危险!100是一个无意义的实际地址,可能指向危险区域。(2)可以使用一个已初始化的指针去给另一个指针赋值,但类型必须一致如果不一致,可进行强制类型转换。char*p=NULL;int*ip=(int*)p+100;/将char型指针强制转化成int型指针。(3)对于基本数据类型的变量、数组元素我们可以使用取地址运算符/定义void类型的指针,数据类型*指针变量名=初始地址表达式;,C+语言程序设计教程第5章构造数据类型,5.3指针,4指针运算指针变量存放的是地址,因此指针的运算实际上就是地址的运算,但正是由于指针的这一特殊性,使指针所能进行的运算受到了一定的限制。指针通常进行下列几种运算:赋值运算、取值运算、算术运算、相减运算、比较运算。(1)*和,C+语言程序设计教程第5章构造数据类型,5.3指针,(2)指针与整数的加减运算指针的加减运算与普遍变量的加减运算不同,由于指针存储的是变量的内存地址,指针加上或减去一个整数n,表示指针从当前位置向后或向前移动n个sizeof(数据类型)长度的存储单元。因此对于不同的数据类型,n的实际大小就不同。例如程序段:intb234;typedefcharA10;int*p1=b10;int*p2=(int*)b1;int*p3=(int*)(b+1);double*pd=(double*)p3;A*pa=(A*)p3;coutp1,p2,p3,pd,paendl;coutp1+1,p2+1,p3+1,pd+1,pa+1endl;,运行结果:0013FF80,0013FF80,0013FF80,0013FF80,0013FF800013FF84,0013FF84,0013FF84,0013FF88,0013FF8A,C+语言程序设计教程第5章构造数据类型,5.3指针,(3)指针自增、自减运算指针的自增、自减运算是指针加减运算的特例。指针的自增或自减表示指针从当前位置向后或向前移动sizeof(数据类型)长度的存储单元。例如:程序段:int*p,*q,a=5;p=/这是一种常用的表达式,依次执行:*q=*p,q+,p+(4)两指针相减当两个指针指向同一数组时,两个指针的相减才有意义。两个指针相减的结果为一整数,表示两个指针之间数组元素的个数。,C+语言程序设计教程第5章构造数据类型,5.3指针,(5)两个指针的比较运算两个指针的比较一般用于下列两种情况:一是比较两个指针所指向的对象在内存中的位置关系;二是判断指针是否为空指针。5void类型指针指向void类型的指针是一种不确定类型的指针,它可以指向任何类型的变量。实际使用void型指针时,只有通过强制类型转换才能使void型指针得到具体变量的值。在没有转换前void型指针不能进行指针的算术运算。例如:void*vp;/定义了一个void型指针vpinti=6,*ip;vp=,C+语言程序设计教程第5章构造数据类型,5.3.2指针与字符串,字符型指针:用于存放字符型变量的地址,而字符串的本质是以0结尾的字符数组,一个字符型指针存储了字符数组的第一个元素的地址,也就存储了字符串的地址,这个指针就指向了字符串。在定义一个字符数组时,可以将一个字符串常量作为初值,但将字符串常量作为初值赋给字符数组和将字符串常量作为初值赋给字符指针变量,二者的含义是不同的。例如:charstr5=abcd;char*p_str=abcd;在上述字符串定义有下列不同:(1)字符数组str5被赋值为“abcd”,因此,数组str的五个数组元素的值分别为字符a、b、c、d和0。字符指针p_str被赋值为“abcd”,则意味着指针p_str的值为字符串常量abcd的第一个字符a在内存中的地址。(2)字符指针p_str比str多分配了一个存储地址的空间,用于存储字符串的首地址。,C+语言程序设计教程第5章构造数据类型,1.一维数组和指针数组元素有两种表示方法:若有inta10;int*p=a;a.下标表示法aipib.指针表示方法*(a+i)*(p+i)即:ai=pi=*(a+i)=*(p+i)正确,5.3.3指针与数组,例题:分析程序的输出结果#includeusingnamespacestd;voidmain()inta5=1,2,3,4,5;intb,c;b=a2+a4;c=*(a+2)+*(a+4);coutb=bendlc=cendl;,5.3.3指针与数组,运行结果:b=8c=8,例题:分析程序的输出结果#includeusingnamespacestd;voidmain()chars=abcde;char*ps=s;coutsendl;couts1s2s3endl;cout*ps*(ps+2)*(ps+4)*ps+2xy;swap1(x,y);coutafterswap1,x=x,y=yn;p=fun(a,n);cout该数据是:*p;,C+语言程序设计教程第5章构造数据类型,5.3.6指针与函数,C+语言程序设计教程第5章构造数据类型,运行结果:123456789012349999912345678901234+99999=012345679001233,5.3.6指针与函数,5.3.6指针与函数,3指向函数的指针在程序运行时,不仅数据要占用内存空间,程序的代码也被调入内存并占据一定的内存空间。每一个函数都有函数名,实际上,这个函数名就是该函数的代码在内存的起始地址。当调用一个函数时,编译系统就是根据函数名找到函数代码的首地址,从而执行这段代码。由此看来,函数的调用形式:函数名(参数表),其实质就是:函数代码首地址(参数表)。函数指针:就是指向某个函数的指针,它是专门用于存放该函数代码首地址的指针变量。一旦定义了某个函数指针,那么,它就与函数名有同样的作用,在程序中就可以象使用函数名一样,通过指向该函数的指针来调用该函数。,C+语言程序设计教程第5章构造数据类型,5.3.6指针与函数,函数指针的定义语法形式如下:其中:数据类型为函数指针所指函数的返回值类型;形参表则列出了该指针所指函数的形参类型和个数。函数指针名与*外面的圆括号()是必须的,圆括号改变了默认的运算符的优先级,使得该指针变量被解释为指向函数的指针。如果去掉圆括号,将被解释为函数的返回值为指针。,数据类型(*函数指针名)(形参表);,C+语言程序设计教程第5章构造数据类型,5.3.6指针与函数,函数指针在使用之前也要进行赋值,使指针指向一个已经存在的函数代码的起始地址。语法形式为:赋值符右边的函数名所指出的必须是一个已经声明过的,和函数指针具有相同返回类型和相同形参表的函数。在赋值之后,就可以通过函数指针名来直接引用该指针所指向的函数。即:该函数指针可以与函数名一样,出现在函数名能出现的任何地方。调用函数指针指向的函数有如下两种格式:例如:intadd(inta,intb);/定义函数int(*fptr)(inta,intb);/定义函数指针fptr=add;/函数指针赋值,或fptr=,C+语言程序设计教程第5章构造数据类型,函数指针名=函数名;,函数指针名(实参表);(*函数指针名)(实参表);,5.3.6指针与函数,采用下列任何一种形式调用函数sum:add(1,2);/用函数名调用函数sum(*fptr)(1,2);/用指向函数的指针调用函数sumfptr(1,2);/用指向函数的指针调用函数sum【例5-10】用指向函数的指针实现各种算术运算的菜单程序。分析:为了实现菜单功能,需要定义一个函数指针数组来存储各函数名(地址),调用时通过各数组元素指向的函数名来调用对应的函数。,C+语言程序设计教程第5章构造数据类型,说明:虽然三种调用形式的结果完全相同,当用指向函数的指针调用函数add()时,习惯上使用(*fptr)(1,2),因为这种形式能更直观地说明是用指向函数的指针来调用函数。指向函数的指针常用来实现菜单程序,根据不同的选择执行菜单项中对应的功能,各功能由指向函数的指针实现。,C+语言程序设计教程第5章构造数据类型,C+语言程序设计教程第5章构造数据类型,运行结果:Selectoperator:1:add2:sub3:multiply,5.3.7指针常量与常指针,1.指针常量如果在定义指针变量时,指针变量前用const修饰,被定义的指针变量就变成了一个指针类型的常变量,指针类型的常变量简称为指针常量。定义指针常量格式如下:修饰符const与指针变量紧邻,说明指针变量不允许修改。既然指针变量的值不能修改,所以一定要在定义时给出初值。例如:char*constp=ABCDE;/定义了一个指针常量p=NULL;/错误,指针常量被赋给一个地址常量p=1234;/错误,指针常量被赋给一个地址常量p=(char*)q;/错误,指针常量被赋给一个地址变量的值因为const修饰的是指针变量,而不是指针指向的值。所以指针指向的值可以更改:*p=1;/正确,更改指针指向的值。p1=1;/正确,用数组访问方式更改指针指向的值。,数据类型*const指针变量=变量名;,C+语言程序设计教程第5章构造数据类型,5.3.7指针常量与常指针,2.常指针如果在定义指针变量时,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量简称为常指针。定义常指针的格式如下定义一个常指针后,指针指向的值就不能被更改,即不能通过指针变量直接更改指针指向的值。constchar*p=ABCDE;/定义了一个常指针*p=1;/错误,试图更改指针指向的值。为了防止通过一个非常指针修改常指针指向的值,将一个常指针赋给一个非常指针是错误的:char*q;q=p;/错误,将一个常指针赋给非常指针。,const数据类型*指针变量=变量名;或数据类型const*指针变量=变量名;,C+语言程序设计教程第5章构造数据类型,5.3.7指针常量与常指针,可以将一个非常指针赋给一个常指针,这是因为const修饰的是指针指向的内容,而不是指针的值(地址值)。p=NULL;/正确p=q;/正确const用在数组的类型前修饰数组元素,数组元素为常量的数组的称为常数组,常数组的元素不可改变,也不可将地址赋值给非常指针变量。constinta3=1,2,3;/定义常数组;a0=0;/错误,常数组的元素不可修改int*p=a;/错误,常数组的地址不能赋给非常指针变量,C+语言程序设计教程第5章构造数据类型,注意:常数组的所有元素必须全部赋初值。constinta=1,2,3;/正确constchara=1,2,3;/正确constinta10=1,2,3;/错误,常数组元素没有全部赋初值,5.3.7指针常量与常指针,3.常指针常量指针常量保护指针的值不被修改,常指针保护指针指向的值不被修改,为了将两者同时保护,可以定义常指针常量,常指针常量意为一个指向常量的指针,指针值本身也是一个常量。常指针类型通常用作函数的形参,以防止在函数体内通过形参修改实参指向的值,以保护实参。常指针常量定义格式如下:其中:左边的const与数据类型相结合,表明数据的值是常量;右边的const用在变量前,表明变量的值是常量。定义一个常指针常量后,修改指针的值与修改指针指向内容的值都是错误的:char*q;constchar*constp=ABCDE;/定义了一个常指针常量q=p;/错误,将一个常指针赋给非常指针。p=q;/错误,试图改变指针常量的值。,const数据类型*const指针变量=变量名;或数据类型const*const指针变量=变量名;,C+语言程序设计教程第5章构造数据类型,5.4引用类型,引用:引用是已存在变量的别名,对引用型变量的操作实际上就是对被引用变量的操作。当定义一个引用型变量时,需要用已存在的变量对其初始化。定义一个引用型变量的语法格式为:其中:数据类型应与被引用变量的类型相同;/refx是一个引用型变量,它被初始化为对整型变量x的引用,数据类型,C+语言程序设计教程第5章构造数据类型,5.4.1引用类型变量的说明及使用,当定义一个引用变量后,系统并没有为它分配内存空间。refx与被引用变量x具有相同的地址,即refx与x使用的是同一内存空间。对引用变量值的修改就是对被引用变量的修改,反之亦然。例如:x=3;coutrefx;/结果为3refx=5;coutx;/结果为5引用变量的内存图如图5-6。,C+语言程序设计教程第5章构造数据类型,5.4.2引用与函数,1.引用作为函数的参数当引用作为函数的形参,在进行函数调用时,进行实参与形参的结合,其结合过程相当于定义了一个形参对实参的引用。因此,在函数体内,对形参进行运算相当于对实参进行运算。与指针相比,引用作为函数参数具有两个优点:函数体的实现比指针简单。用指针作为形参,函数体内形参要带着*参加运算;而用引用作为形参,函数体内参加运算的为形参变量。调用函数语法简单。用指针作为形参,实参需要取变量的地址;而用引用作为形参,与简单传值调用一样,实参为变量。,C+语言程序设计教程第5章构造数据类型,C+语言程序设计教程第5章构造数据类型,运行结果:beforeswap:x=3y=5afterswap:x=5y=3,5.4.2引用与函数,2.引用作为函数的返回值函数返回值类型为引用型,在函数调用时,若接受返回值的是一个引用变量,相当于定义了一个对返回变量的引用。若接受返回值的是一个非引用变量,函数返回变量的值赋给接受变量。如果函数返回值类型为引用型,则要求返回值为左值。这样,函数调用式可以当作左值。,C+语言程序设计教程第5章构造数据类型,C+语言程序设计教程第5章构造数据类型,5.4.2引用与函数,C+语言程序设计教程第5章构造数据类型,运行结果:m1=10m2=10m3=10m4=-858993460-35,5.4.2引用与函数,int型变量接受函数返回的intconstint此时r的值变成200。,const数据类型structstudentlongno,birthday;/学号,生日charname22;/姓名gendersex;/性别floatscore;/成绩;注:结构体及结构体变量的具体用法,有兴趣的同学请参考教材示例程序【例5-14】,在第7章类与对象中我们将进一步对其进行深入学习。,C+语言程序设计教程第5章构造数据类型,注意:结构类型是由多个成员类型组合而成,所以结构类型变量所占内存的大小理论上应为各个成员所占内存大小之和;为了提高对内存的存取速度,C+分配各个结构成员的内存空间以字为单位,以保证其地址在字的整数倍处,所以结构成员内存空间存在间隙。定义了一个结构类型,但并没有定义变量,结构类型中的成员名既不能当作类型名也不能当作变量使用。score=95;/错误,成员名不能当作变量coutsizeof(name);/成员名不能当作类型名,5.5.2联合,1.联合类型的定义联合类型是一种与结构类型类似的数据类型,它提供了一种可以将几种不同类型数据存放于同一段内存,对其中各个成员可以按名存取的机制。联合类型定义的语法形式为:与结构类型不同,联合类型虽然由多个成员类型组合而成,但联合类型变量的各个成员拥有共同的内存空间,联合类型变量所占内存的大小应为各个成员所占内存大小的最大者。,union联合类型名数据类型1成员名1;数据类型2成员名2;数据类型n成员名n;,C+语言程序设计教程第5章构造数据类型,5.5.2联合,在联合类型中,如果其中有构造数据类型,其大小为其中最长的基本数据类型的整数倍。例如,下面定义了联合类型:unionUDatacharCh;shortSint;longLint;unsignedUint;floatf;doubled;charstr10;sizeof(UData)的理论值=sizeof(str)=10;sizeof(UData)的实际值=sizeof(double)*2=16;,C+语言程序设计教程第5章构造数据类型,5.5.2联合,联合变量在内存中的排列当定义联合变量后,联合变量在内存中获得了共同的内存,由于各个成员的数据类型不同,因此长度也不同。各成员在内存排列均从低地址开始,遵循“低地址低字节,高地址高字节”的原则。例如:UDatau;strcpy(u.str,“123456789);/给成员u.str赋初值内存图如下:,C+语言程序设计教程第5章构造数据类型,注:联合类型及联合类型变量的具体用法,有兴趣的同学请参考教材示例程序【例5-16】。,本章小结,枚举类型实质是一组整型符号常量,其中的每个常量都可进行各种运算,对一个枚举变量赋值时一定要类型一致。数组是一组同类型变量,可通过数组名加下标存取其中的单个变量。各个数组元素在内存中顺序排列,数组名表示的是数组的起始地址。可以使用指针运算符,用指针方式存取数组元素。一个多维数组是以低维数组为元素的数组,多维数组在内存中的排列与一维数组相同,即从低地址到高地址顺序排列。数组名、高维名表示的是数组的地址。数组名表示的地址不能是左值,但可以当作函数的形式参数,接受实参传送的地址。以0作为结尾符的字符数组为字符串,数组大小与字符串长度的关系为:sizeof(s)=strlen(s)+1;地址变量称为指针,所有地址变量的长度都是4个字节。地址变量存储数组的地址时(指针指向了数组),可通过指针名以指针方式存取数组元素,也可将指针名当作数组名以数组方式存取元素。但指针比数组多了一个存储地址的内存空间,因此指针名可以作为左值。,C+语言程序设计教程第5章构造数据类型,本章小结,指针指向的动态申请的数组称为动态数组,动态数组所占的内存空间需要在程序中进行释放。指针可作为函数的形参,接受实参传送的地址。引用是一个已存在变量的别名,它与被引用的对象共有内存单元,因此定义一个引用型变量时一定要以一个已存在的变量作为初值。引用作为函数的形参时,可用不赋初值,在函数体内引用变量代替实参进行运算,对形参的改变反映到实参上。引用型函数返回对象被一个引用型变量接受,引用型变量成为返回对象的别名;若被一个非引用变量接收,则将返回变量的值赋给接受变量。引用型函数还可以的是一个左值,接受右值对象的值。常指针、常引用类型通常用作函数的形参,以防止在函数体内通过形参修改实参指向的值,以保护实参。结构类型是各种已存在与已定义类型的组合体,同类型结构变量之间赋值等同于每一个成员之间的赋值,其中数组成员的赋值等同于数组的拷贝。联合类型是各种已存在与已定义类型的共同体,联合变量各成员拥有共同的内存空间。,C+语言程序设计教程第5章构造数据类型,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!