




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章第五章 构造数据类型构造数据类型丘志杰丘志杰电子科技大学电子科技大学计算机学院计算机学院 软件学院软件学院枚举类型枚举类型 “枚举枚举”是指将变量所有可能的取值是指将变量所有可能的取值一一一一列举列举出来,变量的取值只限于列举出来的常出来,变量的取值只限于列举出来的常量。枚举类型的声明的一般形式如下量。枚举类型的声明的一般形式如下 :当当没给各枚举常量指定值时没给各枚举常量指定值时,其值依次默认,其值依次默认为为0、1、2、;在定义枚举类型时,也可;在定义枚举类型时,也可使用赋值号另行指定枚举常量的值。使用赋值号另行指定枚举常量的值。 enumenum 枚举类型名枚举类型名 枚举常量枚举
2、常量1, 1, 枚举常量枚举常量2,2, , 枚举常量枚举常量nn;枚举!枚举!数组数组 数组是一组在内存中数组是一组在内存中依次连续存依次连续存放放的、具有的、具有同一类型同一类型的数据变量的数据变量所组成的集合体。所组成的集合体。数组元素用数组名与带方括号的数组元素用数组名与带方括号的数组数组下标下标一起标识。一起标识。一维数组定义与使用一维数组定义与使用 一维数组定义的一般形式为:一维数组定义的一般形式为: 数据类型数据类型 数组名数组名常量表达式常量表达式;说明:说明: 数组元素的类型可以是数组元素的类型可以是voidvoid型以型以外的任何数据类型。外的任何数据类型。数组名代表数组元
3、素在内存中的起数组名代表数组元素在内存中的起始地址,是一个地址常量。始地址,是一个地址常量。 数组定义之后,系统会将从内存中数组定义之后,系统会将从内存中为其分配为其分配一块连续的存储空间一块连续的存储空间,从第,从第1 1个数据元素开始个数据元素开始依次存放依次存放各个数组元素。各个数组元素。例如:例如: intint a5; a5; 假设地址 内容 符号地址 103410a0 103410a4 103410a8 103410ac 103410b0 a a+1 a+2 a+3 a+4 5*sizeof(int) a0 a1 a2 a3 a4 一维数组的初始化一维数组的初始化 一维数组初始化的
4、语法形式为:一维数组初始化的语法形式为:数据类型数据类型 数组名数组名 常量表达式常量表达式 =初初值值1, 初值初值2, 初值初值n;例如:例如: int array3=5,6,7; int array23=1,2; 存取一维数组元素的语法形式为:存取一维数组元素的语法形式为:数组名数组名 下标表达式下标表达式; 读数组元素的地址读数组元素的地址通过数组名通过数组名来读来读取,格式如下:取,格式如下:数组名数组名+整型表达式整型表达式;或&数组名数组名下标表达式下标表达式; 使用数组要注意的地方使用数组要注意的地方f在使用数组时最常犯的错误是在使用数组时最常犯的错误是下标越界下标越界。f数组
5、名是一个地址常量,不能作为数组名是一个地址常量,不能作为左值左值( (赋值的目标赋值的目标) )。因此,不能将一个数组整体。因此,不能将一个数组整体拷贝给另外一个数组。拷贝给另外一个数组。例如:例如: intint a5,c5,i; a5,c5,i; a=c; a=c;/错误错误! ! 正确的方法是将对应的元素进行拷贝:正确的方法是将对应的元素进行拷贝: for(ifor(i=0;i5;i+)=0;i5;i+) aiai=cici; 字符数组与字符串字符数组与字符串 存放字符型数据的数组称为存放字符型数据的数组称为字符数组字符数组。 1.1.用字符进行初始化用字符进行初始化 例如:例如:cha
6、r s1 =c,h,i,n,a; 2.用字符串进行初始化用字符串进行初始化 例如:例如:char s2 =china;请问:请问:s1、s2所占所占内存空间是多少?内存空间是多少?字符数组的使用字符数组的使用 字符数组也是数组,我们同样可以字符数组也是数组,我们同样可以通过数组名及下标引用数组中的元通过数组名及下标引用数组中的元素。为方便对字符与字符串的处理,素。为方便对字符与字符串的处理,c+c+提供了许多专门处理字符与字提供了许多专门处理字符与字符串的函数。符串的函数。 参看参看p118表表5-1。指针指针指针是指针是c+c+语言最重要特性之一,语言最重要特性之一,也是也是c+c+的主要难
7、点。的主要难点。指针提供了一种较为直观的指针提供了一种较为直观的地址地址操操作的手段,正确地使用指针,可以作的手段,正确地使用指针,可以方便、灵活而有效地组织和表示复方便、灵活而有效地组织和表示复杂的数据。杂的数据。地址与指针地址与指针 地址:当定义一个变量后,内存中将会划地址:当定义一个变量后,内存中将会划出一块由若干个存储单元组成的区域,用于出一块由若干个存储单元组成的区域,用于保存该变量的数据。在保存该变量的数据。在内存里每个存储单元内存里每个存储单元都有各自的编号都有各自的编号,称为地址。,称为地址。 指针:在指针:在c+c+中,提供了指针类型,它是一中,提供了指针类型,它是一种种用于
8、存放内存单元地址的变量类型用于存放内存单元地址的变量类型,地址,地址就存储在这种指针类型的变量中。正因为就存储在这种指针类型的变量中。正因为指指针变量存储的是地址针变量存储的是地址,用它来指明内存单元,用它来指明内存单元,所以形象地称这种地址变量为指针。所以形象地称这种地址变量为指针。 指针变量的定义指针变量的定义例如:例如: int *ip; /定义了一个定义了一个int型的指针变量型的指针变量ip float *fp; /定义了一个定义了一个float型指针变量型指针变量fp sizeof(ip)=sizeof(fp)=4; 数据类型数据类型 * * 变量名;变量名; 指针的初始化与赋值指
9、针的初始化与赋值(1)不要将一个非地址常量、变量以及无意义的实)不要将一个非地址常量、变量以及无意义的实际地址赋给指针变量。如:际地址赋给指针变量。如: int *p=100; / int *p=(int*)100;(对吗?)(对吗?) int *p=(char *)100; (2)可以使用一个已初始化的指针去给另一个指针)可以使用一个已初始化的指针去给另一个指针赋值,但类型必须一致如果不一致,可进行强制赋值,但类型必须一致如果不一致,可进行强制类型转换。类型转换。 char *p=null; int *ip=(int *)p+100; 数据类型数据类型 * *指针变量名指针变量名= =初始地
10、址表达式;初始地址表达式; (3)对于基本数据类型的变量、数组元素我们可以)对于基本数据类型的变量、数组元素我们可以使用取地址运算符使用取地址运算符&来获得它们的地址,但是也只来获得它们的地址,但是也只有类型一致才能赋值。有类型一致才能赋值。 int a10; /定义定义int型数组型数组 int *i_pointer=a;/定义并初始化定义并初始化int型指针型指针 (4)有一种特殊的)有一种特殊的void类型指针,可以存储任何的类型指针,可以存储任何的类型地址;但将一个类型地址;但将一个void类型的地址赋值给非类型的地址赋值给非void类型的指针变量,要使用类型强制转换。类型的指针变量,
11、要使用类型强制转换。 void v; /错误,不能定义错误,不能定义void类型的变量类型的变量 void *vp; /定义定义void类型的指针类型的指针指针运算指针运算 指针通常进行下列几种运算:赋值运算、取指针通常进行下列几种运算:赋值运算、取值运算、算术运算、相减运算、比较运算。值运算、算术运算、相减运算、比较运算。(1 1)* * 和和& &运算运算 *:指针运算符,:指针运算符,&:取地址运算符。:取地址运算符。 例如:例如: int a4=1,2,3; int *ip=&a2; cout*ip; *ip=100; 0013a000 a0=1 0013a004 a1=2 *ip 0
12、013a008 a2=3 0013a00c a3=0 ip 0013a014 ip=0013a008 (2)指针与整数的加减运算)指针与整数的加减运算 指针的指针的加减运算加减运算与普通变量的加减与普通变量的加减运算不同,由于指针存储的是变量的运算不同,由于指针存储的是变量的内存地址,指针加上或减去一个整数内存地址,指针加上或减去一个整数n n,表示指针从当前位置向后或向前,表示指针从当前位置向后或向前移动移动n n个个sizeof(数据类型)(数据类型)长度的存长度的存储单元。因此对于不同的数据类型,储单元。因此对于不同的数据类型,n n的实际大小就不同。的实际大小就不同。(3 3)指针自增
13、、自减运算)指针自增、自减运算 指针的自增、自减运算是指针加减运算的特指针的自增、自减运算是指针加减运算的特例。指针的自增或自减表示指针从当前位置例。指针的自增或自减表示指针从当前位置向后或向前移动向后或向前移动sizeof(数据类型)长度的(数据类型)长度的存储单元。存储单元。 例如:例如: int *p,a=5,b=6,c=7; p=&b; p+; /指针指针p后移后移4个字节个字节,指向指向a(4 4)两指针相减)两指针相减 当两个指针当两个指针指向同一数组时指向同一数组时,两个指,两个指针的相减针的相减才有意义才有意义。两个指针相减的结。两个指针相减的结果为一整数,表示两个指针之间数组
14、元果为一整数,表示两个指针之间数组元素的个数。素的个数。 (5 5)两个指针的比较运算)两个指针的比较运算 两个指针的比较一般用于下列两种情况:两个指针的比较一般用于下列两种情况:一是比较两个指针所指向的对象在内存一是比较两个指针所指向的对象在内存中的中的位置关系位置关系;二是判断指针是否为空;二是判断指针是否为空指针。指针。void类型指针类型指针 指向指向voidvoid类型的指针是一种类型的指针是一种不确定类型不确定类型的指针,它的指针,它可以可以指向任何类型的变量指向任何类型的变量。实际使用。实际使用voidvoid型指针时,只有通过型指针时,只有通过强强制类型转换制类型转换才能使才能
15、使voidvoid型指针得到具体变量的值。在型指针得到具体变量的值。在没有转没有转换前换前voidvoid型指针型指针不能不能进行指针的算术运算。进行指针的算术运算。 例如:例如: voidvoid * *vpvp; /; /定义了一个定义了一个voidvoid型指针型指针vpvp intint i=6, i=6, * *ipip; ; vpvp=&i; / =&i; / vpvp指向整型变量指向整型变量i i coutcout“i=”“i=”* *vpvpendlendl; / ; / 错误错误 coutcouti=i=* *( (intint * *)p)pendlendl; ; ipip
16、=(=(intint * *) )vpvp; /; /ipip指向指向vpvp指向的变量指向的变量i i coutcouti=i=* *ipipendlendl; ; 指针与字符串指针与字符串 字符型指针:字符型指针: 用于存放字符型变量的地址,而用于存放字符型变量的地址,而字符串的本字符串的本质是以质是以00结尾的字符数组结尾的字符数组,一个字符型指针存储了,一个字符型指针存储了字符数组的第一个元素的地址,也就存储了字符串字符数组的第一个元素的地址,也就存储了字符串的地址,这个指针就指向了字符串。的地址,这个指针就指向了字符串。 在定义一个字符数组时,可以将一个字符串在定义一个字符数组时,可
17、以将一个字符串常量作为初值,但将字符串常量作为初值赋给字符常量作为初值,但将字符串常量作为初值赋给字符数组和将字符串常量作为数组和将字符串常量作为初值初值赋给字符指针变量,赋给字符指针变量,二者的含义是不同的。二者的含义是不同的。例如:例如: char str5=abcd; char *p_str=abcd;指针与数组指针与数组 1 1 使用指针操作符使用指针操作符* *存取数组存取数组 指针的加减运算的特点指针的加减运算的特点使得指针操作符特别适使得指针操作符特别适合处理存储在合处理存储在一段连续内存空间一段连续内存空间中的同类型数据。这中的同类型数据。这样,使用指针操作符来对数组及其元素进
18、行操作就非样,使用指针操作符来对数组及其元素进行操作就非常方便。常方便。(1) (1) 一维数组的指针操作一维数组的指针操作 当定义数组一维数组当定义数组一维数组t t anan (t (t为类型为类型) ),下式为,下式为存取数组元素存取数组元素aiai 的等效方式:的等效方式: * *( (a+ia+i) ); 而而a+ia+i为为aiai 的地址。的地址。数组指针数组指针 数组指针是指向数组的指针。数组指针是指向数组的指针。 例如:例如:intint ( (* * a_pa_p) 5;) 5;等效于下列定义方式:等效于下列定义方式: typedeftypedef intint i_a5;
19、 i_a5; i_a i_a * *a_pa_p; ;数组与函数数组与函数 数组名数组名是一个地址,不能当作一个左值,是一个地址,不能当作一个左值,但是可以作为函数的形参,接受实参传送来但是可以作为函数的形参,接受实参传送来的地址。的地址。 当形参接受实参传送来的地址后,形参当形参接受实参传送来的地址后,形参数组与实参数组与实参共享内存中的一块空间共享内存中的一块空间。函数体。函数体通过形参对数组内容的改变会直接作用到实通过形参对数组内容的改变会直接作用到实参上。参上。举例举例 void void func(intfunc(int a,inta,int n) n)intint i; i;for
20、(ifor(i=0;i=0;in;in;i+)+)aiai+=3;+=3; void main()void main()intint a=1,2,3,4,i; a=1,2,3,4,i;func(a,4);func(a,4);for(ifor(i=0;i4;i+)=0;i4;i+) coutcoutaiai:; ; coutcoutendlendl; ; void func(int b,int n);void func(int a10,int n);void func(int *a,int n);指向函数的指针指向函数的指针 在程序运行时,数据和代码都占据一定在程序运行时,数据和代码都占据一定的
21、内存空间。每一个函数都有函数名,的内存空间。每一个函数都有函数名,函数函数名就是该函数的代码在内存的起始地址名就是该函数的代码在内存的起始地址。 函数的调用形式:函数名(参数表),函数的调用形式:函数名(参数表),其实质就是:其实质就是:函数代码首地址(参数表)函数代码首地址(参数表)。 函数指针函数指针就是指向某个函数的指针,是就是指向某个函数的指针,是专门用于存放该函数代码首地址的指针变量专门用于存放该函数代码首地址的指针变量。函数指针的定义语法形式如下:函数指针的定义语法形式如下:数据类型数据类型 (* *函数指针名)(形参表);函数指针名)(形参表); 其中其中: :数据类型为函数指针
22、所指函数的返回值类型;数据类型为函数指针所指函数的返回值类型;形参表则列出了该指针所指函数的形参类型形参表则列出了该指针所指函数的形参类型和个数。和个数。函数指针名与函数指针名与* *外面的圆括号()是必须的,外面的圆括号()是必须的,如果去掉圆括号,将被解释为函数的返回值如果去掉圆括号,将被解释为函数的返回值为指针。为指针。 函数指针的定义函数指针的定义 函数指针在函数指针在使用之前也要进行赋值使用之前也要进行赋值,使指,使指针指向一个已经存在的函数代码的起始地址。针指向一个已经存在的函数代码的起始地址。语法形式为:语法形式为: 函数指针名函数指针名=函数名;函数名;函数指针的初始化函数指针
23、的初始化例如:例如: intint add(intadd(int a,inta,int b);/ b);/定义函数定义函数 intint ( (* *fptr)(intfptr)(int a,inta,int b);/ b);/定义函数指针定义函数指针 fptrfptr=add;/ =add;/ 函数指针赋值函数指针赋值例如:例如: add(1,2); add(1,2); ( (* *fptr)(1,2); fptr)(1,2); fptr(1,2); fptr(1,2);函数指针的使用函数指针的使用调用函数指针指向的函数有如下两种格式:调用函数指针指向的函数有如下两种格式: (* 函数指针名
24、函数指针名) (实参表实参表); 函数指针名函数指针名(实参表实参表);说明:当用指向函数的指针调说明:当用指向函数的指针调用函数用函数add()时,习惯上使用时,习惯上使用 (*fptr)(1,2),因为这种形,因为这种形式能更直观地说明是用指向函式能更直观地说明是用指向函数的指针来调用函数。数的指针来调用函数。二重和多重指针二重和多重指针 如果已经定义了一个指针变量如果已经定义了一个指针变量a a,再定义一个指针再定义一个指针b b,用于指向,用于指向a a,那么,那么称称b b是指向指针是指向指针a a的指针的指针,这样的指针,这样的指针也称也称二重指针二重指针。 三重及以上三重及以上的
25、指针统称为的指针统称为多重指针多重指针。例如:例如: intint a, a,* *p,p,* * *pp,pp,* * * *pppppp; ; p=&a;pp=&p; ppp=&pp;2021-10-1231动态内存分配和释放动态内存分配和释放c的做法的做法void *malloc(size_t size);voidfree(void *pmemory);例如:例如:char * p = (char *)malloc(100);strcpy(p,”hello world!”);printf(“%sn”,p);free(p);2021-10-1232c+的做法的做法 使用使用new和和del
26、ete,使用形式:使用形式:type *p; p=new type; delete p;type是一个是一个数据类型名数据类型名从堆空间中分从堆空间中分配一块与配一块与type类型的数据一类型的数据一样大小的内存样大小的内存用用delete来释来释放该内存空间放该内存空间2021-10-1233例如:动态分配和释放单个数据的存储区例如:动态分配和释放单个数据的存储区#include void main()int *p; p=new int;if(p=null)cout“allocation failure!n”;else*p=15;cout*p;delete p;2021-10-1234用用n
27、ew运算符初始化单个数据的存储区运算符初始化单个数据的存储区语法形式为:语法形式为: type *p; p=new type(初始值初始值); delete p;初始值可以是初始值可以是常量、变量、常量、变量、以及表达式以及表达式2021-10-1235 举例举例#include void main()int *p; p=new int(100);if(p=null)cout“allocation failure!n”;elsecout*p;delete p;提问:提问:如果如果p=new int(98.5),会怎么样?,会怎么样?2021-10-1236 注意:用注意:用delete释放的内
28、存空间释放的内存空间必须是由必须是由new分配的空间,否则执分配的空间,否则执行行delete时将会导致严重的错误。时将会导致严重的错误。例如:例如: int *p; delete p;/出错出错例如:例如: int *p,value; p=&value; delete p;/出错出错2021-10-1237动态分配一维数组的存储空间动态分配一维数组的存储空间 语法为:语法为:type *p;p=new typenum;delete p;num用于指定数组用于指定数组大小,可以是常量、大小,可以是常量、变量、以及表达式变量、以及表达式如果分配成果,如果分配成果, new返回的指针指向数组的返回
29、的指针指向数组的起始位置起始位置2021-10-1238例如:例如:#include void main()int i, *p; p=new int100;if(p=null)cout“allocation failure!n”;elsefor(i=0;i 100;i+)pi=i+1;for(i=0;i 100;i+)coutpi ;delete p;2021-10-1239引用引用 简单地说,引用就是给一个单元简单地说,引用就是给一个单元起一个别名。也就是说,引用与起一个别名。也就是说,引用与它所引用的变量共享存储单元。它所引用的变量共享存储单元。 引用主要有以下三种用法引用主要有以下三种用
30、法: 独立引用独立引用 作为函数参数作为函数参数 作为函数返回类型作为函数返回类型2021-10-1240独立引用独立引用int i=0, k=8;int &ri=i;int *p=&i;ri=k; ri是是i的引用,的引用, i和和ri代表同一个代表同一个内存单元。内存单元。 在声明独立引用时必须对它初始化,在声明独立引用时必须对它初始化,这种情况下的别名绑定是永久的。这种情况下的别名绑定是永久的。2021-10-1241初始化独立引用的几种方式初始化独立引用的几种方式“=”的右端是一个变量的右端是一个变量int a; int &ra=a;“=”的右端是一个常量的右端是一个常量const f
31、loat &r2=1.0;定义常引用定义常引用int x=1;const int &rx=x;rx=98;/错误,只能使用错误,只能使用rx,不能修改不能修改2021-10-1242引用作为函数参数引用作为函数参数 c+和和c一样一样,都是采用都是采用“传值传值”的方式向函数传递参数,从而使的方式向函数传递参数,从而使实际参数和形式参数相结合的。实际参数和形式参数相结合的。在这种情况下,实参和形参是两在这种情况下,实参和形参是两个不同的单元,在结合时,实参个不同的单元,在结合时,实参的值将会被拷贝到形参中。的值将会被拷贝到形参中。2021-10-1243c+函数的传值调用函数的传值调用void func(int num)num+;void main( )int value=5;func( value );cout value ;由于由于“传值传值”方式的存在,方式的存在,因此试图通过改变形参来改因此试图
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CFPA 012-2022消防用压接式涂覆碳钢管材及管件
- T/CEPPEA 5023-2023风光储充一体化充电站设计规范
- T/CEMTA 4-2023工业炸药生产线安全联锁检测方法温度、压力和流量
- T/CECS 10197-2022高分子膜基预铺防水卷材
- T/CCS 062-2023井工煤矿智能化采煤系统运维管理规范
- T/CCOA 56-2023拉面专用小麦粉
- T/CBMCA 028-2022室内空气治理产品
- T/CATCM 013-2021灵芝(赤芝)及其孢子粉质量规范
- T/CASTEM 1015-2023新型研发机构绩效评估规范
- 2024年度江苏省二级注册建筑师之建筑结构与设备模考模拟试题(全优)
- 外科视角解读-《甲状腺结节和分化型甲状腺癌诊治指南(第二版)》
- 2023CSCO免疫检查点抑制剂相关的毒性控制指南(全文)
- 五年级下册分数加减混合运算练习400题及答案
- 不同行业安全管理的特点与要求
- 医学人文素质教育的跨学科研究与创新
- 社区居民满意度调查问卷
- 异常子宫出血护理查房的课件
- 医院基建科招聘笔试题目
- 无创血糖仪行业营销策略方案
- 答案-国开电大本科《当代中国政治制度》在线形考(形考任务一)试题
- 国际经贸新形势下我国外贸高质量发展的挑战及对策
评论
0/150
提交评论