7.3指针与一维数组_第1页
7.3指针与一维数组_第2页
7.3指针与一维数组_第3页
7.3指针与一维数组_第4页
7.3指针与一维数组_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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)将数组某元素的地址赋值给指针变量: 格式为:= &表示把数组某个元素的地址赋给指针变量,让指针变量指向数组的某个元素。in

3、t a10 , *p ;p = &a2 ;考点一:指针的算术运算(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+

4、i)或*(a+i)就是p+i或a+i所指向的数组元素,即ai。例如,*(p+5)或*(a+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】把一个一维数

5、组中的元素按初始顺序的倒序排列。main ( ) int a10=12,3,45,6,20,30,78,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

6、或a+i表示元素的地址, *(a+i)、pi或*(p+i)的形式表示数组元素。指针法:用指针变量p指向数组的首地址,然后通过移动指针存取数组元素。 如 p=a, p+。考点三:数组元素的访问形式若有数组及指针定义 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 一维数组首地址

7、&a i a+ip+i 一维数组下标为 i 的元素地址a0*a*p 一维数组下标为 0 的元素的值a i *(a+i)*(p+i) 一维数组下标为 i 的元素的值考点三:数组元素的访问形式注意:数组名是一个常量地址,不允许重新赋值。指针变量是一个变量地址,可以重新赋值。例如有定义:int a10,*p; p=a;p+合法;但a+不合法(a是数组名,代表数组首地址,是常数地址。)考点四:指针运算符的自增自减运算形式 (*p)+ 表示先取*p的值a0,再使所指的元素的值加1。+(*p) 即+*p:表示先使*p的值a0加1,再取*p的值a0。*(p+)即*p+是先取*p的值,后使p加1,指向

8、下一个元素。*(+p)即 *+p是先使p加1,指向下一个元素,再取*p的值。考点四:指针运算符的自增自减运算形式 main() int a3,*p=a; a0=10;a1=20;a2=30;printf(“%dn”,*p+); printf(“%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; print

9、f(%dn,(*p)+); printf(%dn,a0); printf(%dn,*+p); 答案为:10 11 20案例分析 交流提升PART 03【例1】有以下程序运行后的输出结果是( )。 main() char s=159,*p; p=s; printf(%c,*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)运行后报错

10、 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,*(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,+*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论