《数组与指针》PPT课件.ppt

上传人:牧羊曲112 文档编号:5520176 上传时间:2023-07-18 格式:PPT 页数:30 大小:215.99KB
返回 下载 相关 举报
《数组与指针》PPT课件.ppt_第1页
第1页 / 共30页
《数组与指针》PPT课件.ppt_第2页
第2页 / 共30页
《数组与指针》PPT课件.ppt_第3页
第3页 / 共30页
《数组与指针》PPT课件.ppt_第4页
第4页 / 共30页
《数组与指针》PPT课件.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《《数组与指针》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数组与指针》PPT课件.ppt(30页珍藏版)》请在三一办公上搜索。

1、第十章 数组与指针,10.1 一维数组首地址和数组元素的地址一维数组首地址和数组元素的地址在C语言中,数组占用一串连续的存储单元,如有以下定义:int a5,*p,i;数组中每个元素都可以看作一个变量,因此每个数组元素均有一个地址,例如元素a0的地址可表示为&a0。在上面的定义语句中,指针p的基类型为整型,可以指向任意的一个整型存储单元。我们可以使用p=&a0将指针p指向数据元素a0。由于数组元素在内存中是连续的,因此可以通过移动指针p来访问数组中的每个元素。,C语言规定数组名代表数组在内存中的起始地址,即可以使用a表示数组a的首地址。因此也可以使用p=a来让指针p指向数组的起始地址。需要注意

2、的是:a是一个地址常量,它永远指向a数组的首地址。因此不能对a进行重新赋值,a=或a+;这样的赋值语句都是非法的。,a0,a1,a2,a3,a4,p,二.通过指针引用一维数组元素,(1)通过指针引用数组元素,如有以下的定义语句:int*p,a5;p=,在指针这一章我们学过,可以通过算术运行对指针进行移动。例如p+1表示p所指向存储单元的下一个存储单元,即a1;p+2指向a2,p+3指向a3,所以我们可以使用*(p+1)来表示a1,*(p+2)来表示a2,同样,也可以使用p表示&a0,p+1表示&a1,p+2表示&a2,例10.1 有以下程序:main()int a5,*p,i;for(p=a,

3、i=0;i5;i+)scanf(“%d”,p+i);for(p=a;pa+5;p+)printf(“%d”,*p);,(2)通过数组的首地址引用数组元素,如有定义:int a5;由于a表示数组a的首地址,我们可以把a当作一个指针变量。因此*a等价于a0;*(a+1)等价于a1,同样,a等价于&a0;a+1等价于&a1,例10.2 有以下程序:main()int a5,i;for(i=0;i5;i+)scanf(“%d”,a+i);for(i=0;i5;i+)printf(“%d”,*(a+i);,(3)用带下标的指针变量引用一维数组元素,若有以下定义语句:int*p,a5;p=a;我们可以使用

4、p0来表示p指针指向的内存单元,使用p1表示p指针指向的内存单元的下一个内存单元。也就是说,可以使用p0来表示a0;p1来表示a1 因此,对数组元素ai可以有4种等价的引用方法:ai;pi;*(a+i)*(p+i)。对应地,对ai地址的引用,也有4种等价的引用方法:a+i p+i。从上面可以看出,当指针p指向数组a的首地址后,a和p具有相同的引用方法。但是,a和p有着本质的区别:a是数组而p是指针;a不能重新赋值而p可以随意的重新赋值。,例10.3 有以下程序:main()int a10=1,2,3,4,5,6,7,8,9,10,*p=程序运行的输出结果是_。16 B)10 C)8 D)6答案

5、:B,例10.4 有以下程序:main()int i,s=0,t=1,2,3,4,5,6,7,8,9;for(i=0;i9;i+=2)s+=*(t+i);printf(“%dn”,s);程序执行后的输出结果是_。45 B)20 C)25 D)36答案:C,10.2 二维数组和指针,二维数组的首地址和数组元素的地址 如有以下语句:int a23,*p,i;数组a如下所示:,a0,a00,a01,a02,a1,a10,a11,a12,任何一个二维数组由若干个一维数组组成 实际上,二维数组a由两个元素组成,分别是a0和a1。而a0和a1又分别是两个一维数,如上图所示。a0和a1可以视为这两个一维数组

6、的数组名,它们分别由3个整型元素组成。其中,a0由以下三个元素组成:a00 a01 a02 a1由以下三个元素组成:a10 a11 a12,通过前面学习,我们已经知道一维数组名是一个地址常量,其值为数组第一个元素的地址值,此地址的基类型就是数组元素的类型。在以上二维数组中,a0和a1都是一维数组名,它是一个不可变的地址常量,其值代表每行的首地址。因此,a0代表了a00的地址,a1代表了a10的地址。,如我们使用p=a0;语句进行赋值是合法的,此时p指向了a0所指向的存储单元,即a00。此时a0i和pi等价,*(a0+i)与*(p+i)等价。特别地,因为二维数组在内存中连续顺序存放,a10紧接在

7、a02后面,因此p3虽然已经越界,但是仍然有效,此时p3等价于a10。同时p3也等价于a03,因此在此时a03是合法有效的,等价于a10。,2.二维数组名也是一个地址常量,二维数组名同样也是一个存放地址常量的指针,其值为二维数组中第一个元素的地址。同样,对于二维数组名a,也不可以进行a+、a=a+i之类的赋值运算。对应上面的a数组,a的值与a0的值相同,但是基类型不相同。a可以等价于一个二维指针,而a0是一个一维指针。因此,对于以下的赋值语句是不正确的:p=a;我们可以理解为p是(int*)类型的,而a是(int*)类型的,因此上面的赋值语句中类型不相同。注意:a指针的基类型是3个元素的一维数

8、组,因此地址a+1表示的是a1的地址,a+2表示的地址是a2的地址,所以a+i与&ai等价,*(a+i)与ai等价。,3.二维数组元素及地址,二维数组元素的地址可以由表达式&aij求的,也可以通过每行的首地址来表示。在以上二维数组a中,每个元素的地址可以通过每行的首地址a0、a1来表示。如地址&a00可以用a0+0来表示,地址&a01可以用a0+1表示。取数组元素aij的地址通常以下5种方法:,(1)通过直接在数组元素aij前加取址符号&:&aij。(2)通过第i行的首地址ai加一个数值:ai+j。(3)通过ai与*(a+i)等价:*(a+i)+j。(4)通过数组元素a00的地址为参照:&a0

9、0+4*i+j(在第i行前尚有4*i个元素存在)。(5)通过&a00与a0等价:a0+4*i+j。,在以上表达式中ai、&a00、a0的基类型都是int类型,系统将自动据此来确定表达式中常量1的单位是2个字节。但是不可以把求aij地址的表达式写成:a+3*i+j,因为a的基类型是3个整型元素的数组类型,系统将自动据此来确定常量1的单位是6个字节。以上5个表达式均表示aij的地址,所以只须在每个表达式之前加上*即可得到5种二维数组元素的引用方法。,(1)*(&aij)与aij相同。(2)*(ai+j)。(3)*(*(a+i)+j)。(4)*(&a00+4*i+j)。(5)*(a0+4*i+j)。

10、由于ai与*(a+i)相同,所以aij又可以变形为(*(a+i)+j)。,二.指针数组与二维数组,指针数组指针数组一般定义如下:类型名*指针数组名常量表达式;如:int*p3;在这里,定义了一个具有三个元素的一维数组,其中每个元素只能存放指针,这些指针的基类型必须为整型,故称p为指针数组。既然p是一个一维数组,所以它占用一块连续的内存单元,如下图所示。,p0,p1,p2,我们对指针数组*p3稍加说明:遵照C语言运算符的优先级,的优先级高于*号,因此p首先与结合,构成p3,说明p是一个数组名;在它前面的*号则说明数组p中每个元素只能存放指针。,2.通过指针数组引用二维数组元素,若有以下程序:in

11、t*p3,a32,i,j;在这里,指针数组pi的基类型与ai的基类型相同,均为int类型,因此赋值语句pi=ai合法。赋值号右边的ai代表a数组每行的首地址,赋值号左边的pi是指针变量,循环执行的结果是使p数组中的每个元素指向了a数组每行的开头,如下图所示。,p0,p1,p2,a00,a01,a10,a11,a20,a21,当p数组的每个元素指向a数组每行的开头时,则a数组中的元素aij与*(ai+j)和*(pi+j)是完全等价的。因此,可以通过指针数组p来引用a数组元素,它们的等价形式如下:(1)*(pi+j)与*(ai+j)对应。(2)*(*(p+i)+j)与*(*(a+i)+j)对应。(

12、3)(*(p+i)j与(*(a+i)j对应。(4)pij与aij对应。,例10.5 有以下程序:int a32=1,2,3,4,5,6,*p3;p0=a1;则*(p0+1)所代表的数组元素是_。a01 B)a10 C)a11 D)a12答案:C,三.行指针,定义行指针 行指针一般定义如下:类型名(*指针数组名)常量表达式;如:int(*p)2;在这里,我们定义了一个指针变量p,p只能存放含有两个整型元素的一维数组的首地址。值得注意的是,p并不是一个含有两个元素的一维数组。,对行指针(*p)2稍加说明:遵照C语言运算符的优先级,()的优先级高于号,因此p首先与*结合,说明p是一个指针变量;在它后

13、面的2则说明指针p的基类型为4个整型元素,所以p+1不是让指针p移动一个整型大小(4个字节),而是移动两个整型(8个字节)。如有定义:int(*p)2,a32;p=a;如下图所示。,p+0,a00,a01,p+1,p+2,a10,a11,a20,a21,在执行语句p=a后,p+i就等价于ai,即二维数组第i行的首地址。,2.通过行指针引用二维数组元素,如有定义:int a32,(*p)2;p=a;当指向a数组的开头时,可以通过以下形式来引用aij:(1)*(pi+j)与*(ai+j)对应。(2)*(*(p+i)+j)与*(*(a+i)+j)对应。(3)(*(p+i)j)与(*(a+i)j对应。(4)pij与aij对应。,四.指针数组与行指针的区别,从定义格式上看,指针数组int*p3与行指针int(*p)2极为相似,但二者却有本质区别。前者表示一个数组,它含有三个元素p0、p1、p2,且这三个元素只能存放整型元素的地址;后者却表示一个指针变量,它仅有一个存储空间,只能存放一个长度为2的一维数组的指针。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号