经典C语言第五章数组.ppt
《经典C语言第五章数组.ppt》由会员分享,可在线阅读,更多相关《经典C语言第五章数组.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 5章数组教学目标:本讲介绍C语言中数组的定义和使用,其中重点介绍一维数组的定义、引用、初始化,此外对二维数组的定义、引用和初始化在文中也作了详细的说明。要求大家熟练掌握一维数组的使用,了解的二维数组的应用,灵活运用数组编程。本讲重点:一维数组的定义、初始化及应用;数组元素的引用方法:下标法、数组名法。字符串的使用和字符串函数的应用。本讲难点:利用指针实现对数组的操作;二维数组的应用。教学方法:理论教学与实践教学相结合。第 5章数组5.1一维数组及指针一维数组及指针5.2一一维字符数组及指针维字符数组及指针5.3多维数组及指针多维数组及指针5.4指针数组指针数组5.5二级指针二级指针 5.6
2、 程序程序设计举设计举例例 第五章第五章 数组数组第 5章数组5.1 5.1 一维数组及指针一维数组及指针 数组属于构造类型,数组是具有相同数据类型的变量的序列,序列中的每个变量称为数组元素,数组元素用一个统一的标识符“数组名”和其顺序号“下标”来表示。数组可以是一维的,也可以是多维的。数组必须先定义后使用。第 5章数组5.1.1.一维数组的定义和初始化1一维数组的定义一维数组定义的一般形式为:类型标识符 数组名常量表达式其中,类型标识符表示数组的数据类型,即数组元素的数据类型,可以是任意数据类型,如整型、实型、字符型等。常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数
3、组长度。数组名要遵循标识符的取名规则。如:int a10;定义了一个一维数组,数组名为a,数据类型为整型,数组中有10个元素,分别是:a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。第 5章数组说明:不允许对数组的大小作动态定义。如下面对数组的定义是错误的。int n=10;int an;数组元素的下标从0开始。如数组a中的数组元素是从a0到a9。C语言对数组元素的下标不作越界检查。如:数组a中虽然不存在数组元素a10,但在程序中使用并不作错误处理,所以在使用数组元素时要特别小心。数组在内存分配到的存储空间是连续的,数组元素按其下标递增的顺序依次占用相应字节的内存单元。数组所占字节
4、数为:sizeof(类型标识符)*数组长度。如数组a占用连续20个字节存储空间,为其分配的内存见图5.1。第 5章数组图5.1在函数内或函数外可以同时定义多个数组,还可以同时定义数组和变量,如:float a10,b20,c,d,*p;但在函数的参数中一次只能定义一个数组。2一维数组初始化在定义数组的同时,可以对数组的全部元素或部分元素赋初值,称为数组的初始化。全部元素初始化。在对全部数组元素初始化时,可以不指定数组长度。第 5章数组如:下面对数组a的初始化是等价的:int a10=0,1,2,3,4,5,6,7,8,9;int a=0,1,2,3,4,5,6,7,8,9;a0到a9的值分别为
5、:0,1,2,3,4,5,6,7,8,9。Turbo C中,若数组的存储类型为static,且没有初始化,编译系统自动对数组初始化,将数值型数组的全部元素都初始化为0,将字符型数组的全部元素都初始化为空(0)。如:static int a10;/*数组元素a0到a9的值都为0。*/部分元素初始化。部分元素初始化时,数组的长度不能省略,并且是赋值给前面的元素,没有被赋值的数组元素,数值型数组时值为0,字符型数组时值为0。如:int a10=1,2;/*a0的值为1,a1的值为2,a2到a9的值都为0*/第 5章数组5.1.2一维数组元素的下标法引用一维数组元素的下标表示形式为:数组名表达式其中,
6、表达式的类型任意,一般为算术表达式,其值为数组元素的下标。用下标法引用数组元素时,数组元素的使用与同类型的普通变量相同。若有定义:int a10=1,2,3,4,5,6,7,8,9,10,i=3;则下列对数组元素的引用都是正确的:ai /*表示a3*/a+i /*表示a4*/a3*2 /*下标6的数组元素*/第 5章数组a3.4 /*下标为实型数据,系统自动取整,表示a3*/ab-a /*下标为表达式,表达式b-a的值为1,表示 a1*/a4+=10/*与a4=a4+10等价,表示将a4的原值加10*/a4+/*与a4=a4+1等价,表示将a4的原值加1*/【例5.1】将整型数组a中的十个整型
7、数逆序存放并输出。main()int a10,i,j,t;for(i=0;i10;i+)/*输入10个整型数存入数组a中*/scanf(%d,&ai);for(i=0,j=9;ij;i+,j-)/*交换对称元素值,实现逆序*/t=ai;ai=aj;aj=t;for(i=0;i10;i+)/*输出数组a中的10个元素值*/printf(%4d,ai);运行结果:1 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1第 5章数组需要注意的是数值型数组不能用数组名输入输出它的全部元素,只能是单个元素输入,单个元素输出。如:例5.1中的程序段:for(i=0;i10;i+)s
8、canf(%d,&ai);不能写成:scanf(%d,a);例5.1中的程序段:for(i=0;ia为真,pa+4为假。第 5章数组5.1.4一维数组元素的指针法引用由前面的介绍可知,若有定义:int a10,*p=a;则&ai、(a+i)和(p+i)是等价的,它们都表示数组元素ai的地址。由此可得下列等价关系:ai、*(a+i)和*(p+i)等价。它们都表示下标为i的数组元素。由此可知,一维数组元素除了可以用下标法引用外,还可以用指针法引用。1数组名法用数组名引用数组元素的一般形式为:*(数组名+表达式)其中,表达式类型任意,一般为算术表达式,其值为数组元素的下标。如:*(a+3-1)表示数
9、组元素a2。第 5章数组【例5.2】用数组名法实现例5.1。main()int a10,i,j,t;for(i=0;i10;i+)scanf(%d,a+i);for(i=0,j=9;ij;i+,j-)t=*(a+i);*(a+i)=*(a+j);*(a+j)=t;for(i=0;i10;i+)printf(%4d,*(a+i);第 5章数组2指针变量法用指针变量引用数组元素的一般形式为:*(指针变量+表达式)其中,指针变量为指向一维数组元素的指针变量。表达式类型任意,一般为算术表达式。若指针变量指向下标为0的数组元素,则表达式的值就是要引用的数组元素的下标,否则要引用的数组元素的下标为:指针变
10、量-数组名+表达式。假如p指向a3,则下列用指针变量p对数组元素引用的都是正确的。*p=10 /*与a3=10等价*/*(p+2*2)=20 /*与a7=20等价*/*p+=40 /*与*p=*p+40等价*/第 5章数组【例5.3】用指针变量法实现例5.1。main()int a10,*i,*j,t;for(i=a;ia+10;i+)scanf(%d,i);for(i=a,j=a+9;ij;i+,j-)t=*i;*i=*j;*j=t;for(i=a;ia+10;i+)printf(%4d,*i);在编译时,编译系统将下标表示法转换为数组名表示法,所以用下标法和数组名法的执行效率是一样的,但用
11、指针变量法既简捷,又能提高效率。第 5章数组指向数组元素的指针变量也可用下标法表示数组元素,即*(p+i)和pi是等价的。在使用指针变量引用数组元素时,应注意以下几种情况:*(p+)/*先用p指向的元素值,然后p指向下一个元素*/*(+p)/*p先指向下一元素,然后用p指向的元素值*/*(p-)/*先用p指向的元素值,然后p指向上一个元素*/*(-p)/*p先指向上一元素,然后用p指向的元素值*/*p+/*与*(p+)等价*/*p-/*与*(p-)等价*/(*p)+/*先用p指向的元素值,然后将p指向的元素值加1*/(*p)-/*先用p指向的元素值,然后将p指向元的素值减1*/+(*p)/*先
12、将p指向的元素值加1,然后再用p指向的元素值*/-(*p)/*先将p指向的元素值减1,然后再用p指向的元素值*/第 5章数组【例5.4】main()int a=1,3,5;/*数组初始化,a0=1,a1=3,a3=5*/int*p;p=&a1;/*p指向a1 */printf(*(p+)=%dn,*(p+);/*(p+)=3*/printf(*p=%dn,*p);/*p=5,p指向a2*/p=&a1;/*p指向a1 */printf(*(+p)=%dn,*(+p);/*(+p)=5*/printf(*p=%dn,*p);/*p=5,p指向a2*/p=&a1;/*p指向a1 */printf(*
13、(p-)=%dn,*(p-);/*(p-)=3*/printf(*p=%dn,*p);/*p=1,p指向a0*/第 5章数组 p=&a1;/*p指向a1 */printf(*(-p)=%dn,*(-p);/*(-p)=1*/printf(*p=%dn,*p);/*p=1,p指向a0*/p=&a1;/*p指向a1 */printf(*p+=%dn,*p+);/*p+=3*/printf(%dn,*p);/*p=5,p指向a2*/p=&a1;/*p指向a1 */printf(*p-=%dn,*p-);/*p-=3*/printf(*p=%dn,*p);/*p=1,p指向a0*/p=&a1;/*p指
14、向a1 */printf(*p)+=%dn,(*p)+);/*(*p)+=3*/printf(*p=%dn,*p);/*p=4,即a1=4,p指向a1 */p=&a1;/*p指向a1 */第 5章数组 printf(*p)-=%dn,(*p)-);/*(*p)-=4*/printf(*p=%dn,*p);/*p=3,即a1=3,p指向a1 */p=&a1;/*p指向a1 */printf(+(*p)=%dn,+(*p);/*+(*p)=4*/printf(*p=%dn,*p);/*p=4,即a1=4,p指向a1 */p=&a1;/*p指向a1 */printf(-(*p)=%dn,-(*p);
15、/*-(*p)=3*/printf(*p=%dn,*p);/*p=3,即a1=3,p指向a1 */第 5章数组 5.2 5.2一维字符数组及指针一维字符数组及指针5.2.1一维字符数组的定义和初始化一维字符数组的定义和初始化1一维字符数组的定义C语言中没有专门的字符串变量,字符串的存放和处理可以用字符数组来实现。一维字符型数组定义的一般形式为:char 数组名常量表达式如:char str6;字符数组str有6个元素,分别为:str0,str1,str2,str3,str4,str5。字符数组中的一个元素存放一个字符。如字符数组str只能存放6个字符。第 5章数组2一维字符数组的初始化一维字符
16、数组的初始化字符数组初始化时,可以用字符常量,也可用字符串常量,全部元素初始化时,数组的长度可以省略。用字符常量初始化可以用字符常量对字符数组的全部元素初始化。如:char str3=U,S,A;等价于下面的初始化:char str=U,S,A;字符数组str中有3个元素,str0的值为U,str1 的值为S,str2的值为A。见图5.2。图5.2第 5章数组也可以用字符常量对字符数组的部分元素初始化。如:char str6=U,S,A;字符数组str中有6个元素,str0的值为U,str1 的值为S,str2的值为A,未初始化的元素str3、str4和str5的值都为空(0)。见图5.3。用
17、字符串常量初始化可以用字符串常量对字符数组的全部元素初始化。如:char str=USA;可将花括号省略,即写成:char str=USA;等价于下面的用字符常量初始化:char str=U,S,A,0;。第 5章数组字符数组str中有四个元素,str0的值为U,str1 的值为S,str2的值为A,str3的值为0。见图5.4。由此可知,用字符串常量初始化字符数组时,字符数组的长度至少要比字符串的最大长度多一,最后一个元素用来存放字符串结束标志0。也可以用字符串常量对字符数组的部分元素初始化。部分元素初始化时,长度不能省略。如:char str6=USA;与下面的用字符常量初始化等价:cha
18、r str6=U,S,A,0,0,0;见图5.5。图5.4图5.5第 5章数组5.2.2字符数组的输入和输出1字符串输出函数puts()一般调用格式:puts(str)其中,参数str可以是地址表达式(一般为数组名或指针变量),也可以是字符串常量。功能:将一个以0为结束符的字符串输出到终端(一般指显示器),并将0转换为回车换行。返回值:输出成功,返回换行符(ASCII码为10),否则,返回EOF(-1)若有定义:char str=China;则:puts(str);的输出结果为:China puts(str+2);的输出结果为:ina第 5章数组说明:使用puts()函数的函数前面要有文件包含
19、:#include stdio.h 或#include 输出的字符串中可以包含转义字符,并输出到第一个0为止,并将0转换为n,即输出完字符串后回车换行。如:char str=chinanliaoning0jinzhou;输出结果为:china liaoning puts()函数一次只能输出一个字符串。第 5章数组2字符串输入函数gets()一般调用格式为:gets(str)其中,参数str是地址表达式,一般是数组名或指针变量。功能:从终端(一般指键盘)输入一个字符串,存放到以str为起始地址的内存单元。返回值:字符串在内存中存放的起始地址,即str的值。如:char str20;gets(a)
20、;把从键盘上输入的字符串存放到字符数组str中。说明:使用gets()函数的函数前面要有文件包含:#include stdio.h 或#include gets()函数一次只能输出一个字符串。系统自动在字符串后面加一个字符串结束标志0。第 5章数组3字符数组的输出可以用两种方法输出字符数组:(1)单个字符输出。用格式输出函数printf()的%c的格式,或用字符输出函数putchar()。(2)将整个字符串一次输出。用格式输出函数printf()的%s格式,或用字符串输出函数puts()。将整个字符串一次输出时要注意以下几点:输出字符不包括字符串结束标志0。printf()的%s格式的输出项参
21、数和puts()的参数是地址表达式,而不是数组元素名。如:char str10=China;printf(%s,str);/*输出:China*/puts(str+2);/*输出:ina*/第 5章数组 如果数组长度大于字符串的实际长度,也只输出到0结束。如果一个字符数组中包含一个以上的0,则遇到第一个0输出结束。如:char str10=china0usa;printf(%s,str);输出结果为:china第 5章数组4字符数组的输入字符数组输入也有两种方法:(1)单个字符输入。可以用格式输入函数scanf()的%c格式,或用字符输入函数getchar()。(2)将整个字符串一次输入。可以
22、用格式输入函数scanf()的%s格式,或用字符串输入函数gets()。将整个字符串一次输入时要注意以下几点:用scanf()的%s格式不能输入含有空格的字符串,遇到空格系统认为输入结束,所以用scanf()函数一次能输入多个不含空格的字符串。用gets()函数能够输入含有空格的字符串,但一次只能输入一个字符串。第 5章数组如:char str112;scanf(%s,str1);printf(%s,str1);数据输入:how are you输出结果:how字符数组str1的内容见图5.6。图5.6如果改为:char str112;gets(str1);printf(%s,str1);数据输
23、入:how are you输出结果:how are you第 5章数组字符数组str1的内容见图5.7。(代表空格)图5.7如果改为:char str14,str24,str34;scanf(%s%s%s,str1,str2,str3);printf(%sn%sn%s,str1,str2,str3);数据输入:how are you输出结果:how are you 字符数组str1、str2和str3的内容见图5.8。第 5章数组 系统自动在最后一个字符的后面加上一个字符串结束符0。scanf()的%s格式的输入项是数组名时,数组名前不能加取地址符“&”,因为数组名本身代表数组的首地址。第 5
24、章数组5.2.3用字符数组实现字符串若字符串存放在字符数组中,对字符串中字符的引用可以用下标法,也可用指针法。其引用形式和前面介绍的一维数组元素的引用相同。1用下标法引用【例5.5】将一个字符串逆置后接到原串的后面。#include stdio.hmain()char str81;int i,j;gets(str);i=0;while(stri!=0)i+;第 5章数组j=i;i-;while(i=0)strj=stri;i-;j+;strj=0;puts(str);运行结果:abcabccba第 5章数组2用数组名法引用【例5.6】将字符数组a中的字符串复制到字符数组b。#include s
25、tdio.hmain()char a81,b81;int i=0;gets(a);while(*(a+i)!=0)*(b+i)=*(a+i);i+;*(b+i)=0;puts(b);运行结果:chinachina第 5章数组3用指针变量法引用【例5.7】删除字符串尾部空格。#include stdio.h main()char str80,*p;gets(str);p=str;while(*p)p+;p-;while(*p=)p-;p+;*p=0;printf(%s,str);运行结果:abcdabcd/*光标在d的后一列上*/第 5章数组5.2.4用字符指针变量实现字符串除了能用字符数组处理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 经典 语言 第五 数组
限制150内