《第04章C数组与指针.ppt》由会员分享,可在线阅读,更多相关《第04章C数组与指针.ppt(15页珍藏版)》请在优知文库上搜索。
1、1第四章第四章 数组与指针数组与指针 4.1 4.1 数组的概念与声明数组的概念与声明 4.1.1 4.1.1 数组的概念数组的概念 数组是一个由类型相同的变量组成的线性序列。概念上,它如数组是一个由类型相同的变量组成的线性序列。概念上,它如同代数中的向量:同代数中的向量:(a1,a2,.,an)。4.1.2 4.1.2 数组的声明数组的声明 与简单变量一样,在使用前必须声明之。其声明形式如下:与简单变量一样,在使用前必须声明之。其声明形式如下:int a10;/声明声明 a 是一个长度为是一个长度为10的整型数组,的整型数组,a是数组名;是数组名;数组数组a中元素的变量名以及它们的存储空间情
2、况,如下所示:中元素的变量名以及它们的存储空间情况,如下所示:2说明:说明:(1 1)数组中各元素的下标是从)数组中各元素的下标是从0 n-1。即它们的变量名依次为:。即它们的变量名依次为:通常,它们也被称为通常,它们也被称为“下标变量下标变量”。(2 2)数组中各元素所占用的存储单元,它们的地址是连续的(即地)数组中各元素所占用的存储单元,它们的地址是连续的(即地址相邻)。如下所示:址相邻)。如下所示:变量名:变量名:地地 址:址:34.1.3 4.1.3 数组的初始化数组的初始化 是指:在数组声明时为其中所有的下标变量赋值。是指:在数组声明时为其中所有的下标变量赋值。int a10=1,2
3、,3,4,5,6,7,8,9,10;int a10=1,2,3,4,5,6,7,8,9,10;说明:说明:初始化的几种形式(参见初始化的几种形式(参见P.75P.75)44.1.4 4.1.4 下标变量的引用下标变量的引用 下标变量可以像简单变量一样地被使用下标变量可以像简单变量一样地被使用,而且而且元素的下标可以是元素的下标可以是常量、变量、表达式。常量、变量、表达式。例如:例如:ai=ai-1+1;cinai;coutai;等等。等等。注意:注意:引用数组名将表示对数组进行整体操作,除非作为引用数组名将表示对数组进行整体操作,除非作为函数的参数或字符串时,否则,其他情况下,必须以引函数的参
4、数或字符串时,否则,其他情况下,必须以引用下标变量的方式来处理数组(如:赋值、输入、输出用下标变量的方式来处理数组(如:赋值、输入、输出等等操作)。等等操作)。54.1.5 4.1.5 数组的基本操作数组的基本操作参见参见P.76P.76(1 1)数组元素的输入)数组元素的输入(2 2)数组元素的输出)数组元素的输出(3 3)数组元素的求和)数组元素的求和(4 4)求数组中的最小(大)元素的值)求数组中的最小(大)元素的值 (5)求数组中的最小(大)元素的下标)求数组中的最小(大)元素的下标 64.1.6 4.1.6 数组的应用数组的应用 数组主要用于存放并且处理一组类型相同的数据。数组主要用
5、于存放并且处理一组类型相同的数据。如:排序、检索等操作。如:排序、检索等操作。参见参见P.77/P.77/【例】【例】4.34.3、4.4;4.4;P.95/P.95/【例】【例】4.13-4.14;4.13-4.14;7例例4-1 一维数组的排序一维数组的排序(非递减非递减)。void main()int a=79,97,68,77,89,84,62,55,78,98,79,67,85,71,65,80,100;int i,j,k,x,temp,len;len=sizeof(a)/sizeof(int);for(i=0;ilen-1;i+)/该排序法被称为该排序法被称为“选择排序选择排序”法
6、法x=ai;k=i;for(j=i+1;jx)x=aj;k=j;temp=ai;/ai与与ak交换值交换值ai=ak;ak=temp;for(i=0;ilen;i+)cout a it;sizeof是运算符,其语法形式:是运算符,其语法形式:sizeof(数组名或变量名或类型名数组名或变量名或类型名)运算结果为该数组或变量或类型所占运算结果为该数组或变量或类型所占内存的字节数。内存的字节数。8例例4-2 对一对一批批学生的百分制成绩,统计出学生的百分制成绩,统计出其中其中100分、分、9099分、分、8089分、分、09分的人数。分的人数。#define NUM 20void main()in
7、t scoreNUM;/声明成绩数组声明成绩数组scoreint counter11;/声明声明计数器计数器数组数组counterint i;srand(unsigned)time(NULL);for(i=0;iNUM;i+)scorei=(int)(rand()%101);/利用随机函数产生成绩利用随机函数产生成绩for(i=0;i11;i+)counteri=0;/计数器数组计数器数组counter置置0for(i=0;iNUM;i+)counter scorei/10+;/利用利用counter数组数组计数计数for(i=0;i11;i+)if(i!=10)cout(i*10)-(i*1
8、0+9):counter iendl;else cout(i*10):counter iendl;9课外练习课外练习关于一维数组关于一维数组(1 1)阅读理解程序阅读理解程序 P.76基本操作;基本操作;P.77/【例】【例】4.3、4.4;P.95/4【例】【例】4.134.14;(2 2)参见参见P.100三、程序填空三、程序填空/1、2、3、5;(3 3)编程序:)编程序:将一个已知数组将一个已知数组a中的元素颠倒存放。中的元素颠倒存放。例如,原来为:(例如,原来为:(a1,a2,a3,a4,an),),处理后为:(处理后为:(an,an-1,a3,a2,a1)。)。(4 4)编程序:输
9、入)编程序:输入n(nn(n可变,但不超过可变,但不超过20)20)个整数,输出它们的平个整数,输出它们的平均值以及所有超过平均值的数。均值以及所有超过平均值的数。10 4.2 4.2 二维数组的概念与声明二维数组的概念与声明 4.2.1 4.2.1 二维数组的概念二维数组的概念4.2.3 4.2.3 二维数组的声明二维数组的声明4.2.6 4.2.6 二维数组的基本操作二维数组的基本操作 课外练习:课外练习:p.104/四四-1.4.2.3 4.2.3 二维数组的声明二维数组的声明参见参见P.80P.804.2.4 4.2.4 二维数组的内存情况二维数组的内存情况4.2.5 4.2.5 二维
10、数组的初始化二维数组的初始化11 4.3 4.3 字符数组与字符串字符数组与字符串 “字符串的内存情况字符串的内存情况”、“处理处理字符串的库函数字符串的库函数”参见参见P.84 课外练习课外练习参见参见P.100P.100二、读程序,写运行结果二、读程序,写运行结果/2./2.12 4.4 4.4 指针及其与数组的关系指针及其与数组的关系 4.4.4 4.4.4 指针与数组指针与数组参见参见P.87P.874.4.1 4.4.1 指针的概念指针的概念参见参见P.35P.354.4.2 4.4.2 指针的运算指针的运算4.4.3 4.4.3 利用指针动态申请和释放内存空间利用指针动态申请和释放
11、内存空间运算符运算符newnew与与deletedelete4.4.5 4.4.5 指针与字符串指针与字符串参见参见P.92P.9213 关于指针的一些说明及例子关于指针的一些说明及例子若有以下变量声明:若有以下变量声明:int a=2,*p=&a;则两者的物理关系如下所示:则两者的物理关系如下所示:2pa3f00e02p变量名变量名:a地址值地址值:3f00e0变量值变量值:2 由于变量的地址值(由于变量的地址值(&变量名)具体是多少,对程序而言,变量名)具体是多少,对程序而言,通常是无关紧要的。因此,两者的关系可以简单表示为:通常是无关紧要的。因此,两者的关系可以简单表示为:14pa1称为
12、称为p指向指向a若有下面语句:若有下面语句:int a=1,*p;p=&a;int a=1,*p=&a;等价与等价与则它们的物理关系可以如下图所示:则它们的物理关系可以如下图所示:若接着执行下面语句:若接着执行下面语句:a=2;*p=3;2pa3pa若接着执行:若接着执行:couta=aendl;cout*p=*pendl;则输出:则输出:由此可见,这时的由此可见,这时的*p与与a是等价的是等价的它也可以作为它也可以作为变量变量a的的“名字名字”来使用!来使用!a=3*p=3 进一步而言,由于指针进一步而言,由于指针p也是变量,因此我们还也是变量,因此我们还可以如下定义另一个指向指针变量可以如
13、下定义另一个指向指针变量p的指针变量的指针变量q:int *q=&p;这时,由于这时,由于*q与与p等价,因此等价,因此*q 与与*p、a就都是等就都是等价的了价的了它们都可以作为变量它们都可以作为变量a的的“名字名字”来使用!来使用!q3pa切记:切记:每当一个指针每当一个指针(p)(p)指向一个变量指向一个变量(a)(a)时,时,*指针名指针名(*p)p)就相当于该变量就相当于该变量(a)(a)的一个的一个“别名别名”也叫做也叫做:通过指针通过指针(p)(p)间接访问变量间接访问变量(a)(a)!15paa1为什么声明指针时需要指定类型呢?而指针的类型又有什么作用呢?为什么声明指针时需要指
14、定类型呢?而指针的类型又有什么作用呢?我们来看下面的情况:我们来看下面的情况:int a=1,*pa=&a;char ch=A,*pch=&ch;pchchApafa30fa31fa32fa33pchfd60fd61 在前面我们已经知道,指针在前面我们已经知道,指针papa、pchpch的值分别是变量的值分别是变量a a、chch的的首地址首地址而已而已。那么每当遇到。那么每当遇到*papa、*pchpch时,系统是如何知道时,系统是如何知道papa指向的变量占用了指向的变量占用了4 4个字节、而个字节、而pchpch指向的变量只占用了指向的变量只占用了2 2个字节呢?个字节呢?.这就是为什么声明指针时需要指定类型!这就是为什么声明指针时需要指定类型!变量占用的字节地址变量占用的字节地址ach切记:切记:每个指针可以指向相同类型每个指针可以指向相同类型的任何变量,但决不允许指向不的任何变量,但决不允许指向不同类型的变量!如:同类型的变量!如:int a,b,int a,b,*p;p;char ch;char ch;p=&a;/p=&a;/此时,此时,p p指向指向a a p=&b;/p=&b;/现在,现在,p p指向指向b b p=&ch;/p=&ch;/错误!不能指向错误!不能指向chch