1、CONTENTS 目 录提出问题 引入新课自主学习 明确考点案例分析 交流提升仿真演练 体验探索提出问题 引入新课PART 01数组包含若干个元素,各元素在内存中都占用内存单元,都有一个相应的地址,哪如何通过指针变量来引用数组中的元素呢?提出问题 引入新课自主学习 明确考点PART 02定义一个指向数组元素的指针变量,目的是为了通过指针变量对数组元素进行引用和相关的操作。但由于数组分为两个层次,整个数组和组成数组的各个元素,因此在建立指针变量与数组之间的指向关系时,会有两种不同的情况:考点一:指向一维数组的指针变量1)数组的指针是指向整个数组的起始地址,即数组的第一个元素的地址;2)指针指向一
2、维数组元素的地址。2、指向一维数组的指针变量的两种形式:(1)将整个数组的地址赋值给指针变量:=;例如:int a10;/*定义a为包含10个整型数据的数组*/int*p;/*定义p为指向整型变量的指针*/p=&a0;或p=a;/*C语言规定,数组名代表数组的第一个元素的地址*/p=&a0;表示把a0元素的地址或为数组的首地址赋给指针变量p,p指向a数组的第一个元素的地址,使指针变量指向数组的首个元素的地址,并非将数组元素的值赋给p。(2)将数组某元素的地址赋值给指针变量:格式为:=&;表示把数组某个元素的地址赋给指针变量,让指针变量指向数组的某个元素。int a10,*p;p=&a2;考点一
3、:指针的算术运算(1)地址偏移法。地址偏移法是在指针变量的基础上加上偏移地址形成新元素的地址,再通过指针运算符进行引用。考点二:通过指针变量引用数组元素【例1】、通过指针变量p对数组a的每一个元素进行输入和输出的操作。main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+i);for(i=0;i10;i+,p+i)printf(%d,*p);(2)下标法:如果p的初值为&a0,则:(1)p+i和a+i就是ai的地址,或者说它们指向a数组的第i个元素。(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即ai。例如,*(p+5)或*(a+
4、5)就是a5。(3)指向数组的指针变量也可以带下标,如pi与*(p+i)等价。考点二:通过指针变量引用数组元素【例2】输出数组中的全部元素。(下标法)main()int a5,i,*p;p=a;for(i=0;i5;i+)pi=i;for(i=0;i5;i+)printf(a%d=%d ,i,ai);(3)指针移动法。指针移动法是通过对指针变量进行运算,改变其指向,使其在数组范围内移动,指向不同的元素来达到引用的目的。运行结果为:a0=0 a1=1 a2=2 a3=3a 4=4【例3】把一个一维数组中的元素按初始顺序的倒序排列。main()int a10=12,3,45,6,20,30,78,
5、50,66,81;int *p,*q,i,t;printf(数组元素的初始顺序:n);for(p=a,i=0;i10;i+)printf(%4d,*(p+);for(p=a,q=a+9,i=0;i5;i+,p+,q-)t=*p;*p=*q;*q=t;printf(n数组元素的最终顺序:n);for(p=a,i=0;i 10;i+)printf(%4d,*(p+);下标法:用 ai 的形式存取数组元素。地址法:用p+i或a+i表示元素的地址,*(a+i)、pi或*(p+i)的形式表示数组元素。指针法:用指针变量p指向数组的首地址,然后通过移动指针存取数组元素。如 p=a,p+。考点三:数组元素的
6、访问形式若有数组及指针定义 int a5,*p=a;下标法:a0 a1 a2 a3a4指针法:*p*(p+1)*(p+2)*(p+3)*(p+4)p0 p1p2p3 p4 *a*(a+1)*(a+2)*(a+3)*(a+4)元素地址 p p+1 p+2p+3p+4 a a+1a+2 a+3a+4数组元素的访问小结:假设 int i,a10,*p=a;表现形式含义&a0 ap 一维数组首地址&a i a+ip+i 一维数组下标为 i 的元素地址a0*a*p 一维数组下标为 0 的元素的值a i*(a+i)*(p+i)一维数组下标为 i 的元素的值考点三:数组元素的访问形式注意:数组名是一个常量地
7、址,不允许重新赋值。指针变量是一个变量地址,可以重新赋值。例如有定义:int a10,*p;p=a;p+合法;但a+不合法(a是数组名,代表数组首地址,是常数地址。)考点四:指针运算符的自增自减运算形式(*p)+表示先取*p的值a0,再使所指的元素的值加1。+(*p)即+*p:表示先使*p的值a0加1,再取*p的值a0。*(p+)即*p+是先取*p的值,后使p加1,指向下一个元素。*(+p)即*+p是先使p加1,指向下一个元素,再取*p的值。考点四:指针运算符的自增自减运算形式 main()int a3,*p=a;a0=10;a1=20;a2=30;printf(“%dn”,*p+);prin
8、tf(“%dn”,*+p);答案为:10 30 例如:对照下列程序,请仔细思考为什么是这样的答案?main()int a3,*p=a;a0=10;a1=20;a2=30;printf(“%dn”,+*p);printf(“%dn”,*+p);答案为:11 20 main()int a3,*p=a;a0=10;a1=20;a2=30;printf(%dn,(*p)+);printf(%dn,a0);printf(%dn,*+p);答案为:10 11 20案例分析 交流提升PART 03【例1】有以下程序运行后的输出结果是()。main()char s=159,*p;p=s;printf(%c,*
9、p+);printf(%c,*p+);A)15B)16C)12D)59【例2】、有以下程序运行后的输出结果是()#include main()int a=1,2,3,4,5,6,7,8,9,10,11,12,*p=a+5,*q=NULL;*q=*(p+5);printf(%d%dn,*p,*q);A)运行后报错 B)6 6C)6 11D)5 10【例3】设有定义语句 int x6=2,4,6,8,5,7,*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是()A)for(i=0;i6;i+)printf(%2d,*(p+);B)for(i=0;i6;i+)printf(%2d
10、,*(p+i);C)for(i=0;i6;i+)printf(%2d,*p+);D)for(i=0;i6;i+)printf(%2d,(*p)+);仿真演练,体验探索PART 041、写出以下程序运行后的输出结果是()main()int a=1,2,3,4,5;int *p=a+3;printf(“%d,%d,%dn”,*p,*(p+1),*p+3);2、写出以下程序运行后的输出结果是()main()int a4=10,20,30,40,*p=a;printf(%dn,*p+);printf(%dn,+*p);printf(%dn,(*p)+);3、以下程序运行后的输出结果是()。main()char a=Language,b=Programe;char*p1,*p2;int k;p1=a;p2=b;for(k=0;k=7;k+)if(*(p1+k)=*(p2+k)printf(%c,*(p1+k);
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。