《指针与数组》PPT课件.ppt
《《指针与数组》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《指针与数组》PPT课件.ppt(113页珍藏版)》请在三一办公上搜索。
1、第4章 指针与数组,第一节 一维数组第二节 二维数组第三节 字符数组与字符串第四节 指针数组指针小结,C语言程序设计 龙昭华主编,1/113,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),2/113,迄今为止,我们使用的都是属于基本类型,如:整型、字符型、实型等类型的数据。而C还提供了构造类型,如:数组类型、结构体类型、公用体类型等。构造类型数据是由基本类型数据按一定规则组成的,因此有些书称它们为“导出类型”。在程序设计中,常常需要处理大量同类型的相关数据,如每个学生的成绩记录,多个相同类型数据的排序等。这类数据在计算机语言中可以通过数组来表示。所谓数组
2、就是具有相同数据类型的有序集合。在C语言中,数组具有以下几个特点:数组的所有元素使用一个共同的名字,称为数组名,数组名使用标识符来表示。每个数组元素的使用由数组的下标来确定。数组元素的个数必须在定义时确定,程序中不可改变。在C语言中,数组下标是从0开始,到数组元素个数减1结束的。同一数组中的每一元素具有相同的数据类型(可以是基本类型或构造类型等)。同一数组在内存中占据一段连续的存储单元。数组中元素的作用相当于简单变量。数组必须先定义后使用。,课件制作:刘达明 023-66834110,一、一维数组的定义和引用,第一节 一维数组,(第四章 指针与数组),3/113,1、一维数组的定义 一维数组是
3、指只有一个下标的数组元素所组成的数组。一维数组的定义方式为:类型说明符 数组名常量表达式;例如:int a10;它表示数组名为a,此数组有10个元素,分别为a0、a1、a2、a3、a4、a5、a6、a7、a8、a9。又如:存放30个学生的数学成绩,用一维数组定义如下:int grade30;其元素分别为:grade0,grade29共30个。,课件制作:刘达明 023-66834110,一维数组的定义说明,第一节 一维数组,(第四章 指针与数组),4/113,数组名定名规则和变量名相同,遵循标识符定名规则。它表示各数组元素的统一名字,用以唯一标识数组。数组名后是用方括号的常量表达式,不能用圆括
4、号代替。如int a(20);是错误的。常量表达式的值表示数组中所包含的元素的个数,即数组的长度。如int a20;表示数组a有20个元素,分别为a0、a1、a19。注意不能使用数组元素a20。常量表达式中可以包括常量和符号常量,不能包含变量。即在C语言中不允许对数组进行动态定义,数组的大小不会随着程序运行中的变化而改变。错误定义:int n;scanf(“%d”,。注意:数组必须先定义,后使用。,课件制作:刘达明 023-66834110,2、一维数组的引用,第一节 一维数组,(第四章 指针与数组),5/113,数组的具体使用对象是其中的数组元素。在一个数组定义好后,在内存中分配一组连续的存
5、储空间。如:int a5;存储方式见右图。数组元素的引用格式为:数组名下标;这里的下标与数组定义时不同,不仅可以是整型常量或整型表达式,还可以是含有已赋值变量的整型表达式。数组的下标从0开始算起。如:b0=b5+b7-b2*3。又如:int i15;int n=3;i0=-10;i5=6;in*4=9;,课件制作:刘达明 023-66834110,一维数组的引用说明,第一节 一维数组,(第四章 指针与数组),6/113,数组元素和普通基本型变量一样的使用,可出现在C语言表达式中的任何地方。C语言规定只能逐个引用数组元素,而不能一次引用整个数组。C语言不提供数组下标越界的保护,设计时要注意。如:
6、int b5;只能有效引用b0、b1、b2、b3、b4。如果程序中出现b5,这时C的编译系统不会出错,但b5的值是 不确定的。,课件制作:刘达明 023-66834110,3、一维数组的初始化,第一节 一维数组,(第四章 指针与数组),7/113,数组在定义后,它所占有的存储单元中的值是不确定的,引用数组元素之前,必须保证数组的元素已经被赋以确定的值。对数组元素的初始化可以用以下方法实现:通过赋值语句或输入语句对数组中的元素赋值。在数组定义时对数组中的元素赋值。对数组元素赋值的方法是从数组的第一个元素开始依次给出初始表,表中各值之间用逗号分开。一般格式为:static=如:int a5=1,3
7、,259,-1,-10;static int b5=1,3,259,-1,-10;char word5=a,b,c,d,e;,课件制作:刘达明 023-66834110,一维数组的初始化说明:,第一节 一维数组,(第四章 指针与数组),8/113,是用逗号分隔的数据。若对数组中的所有元素都赋初值,可不必指出元素个数,即可以不指定数组长度。如:int a=1,3,259,-1,-10;也表示数组a有5个元素。它等价于:int a5=1,3,259,-1,-10;也等价于 a0=1;a1=3;a2=259;a3=-1;a4=-10。而没有给出数组长度的赋初值,即使后面每个元素的初值全是0,也要写出
8、来。如:int b=1,2,3,0,0,0;认为是6个元素的数组,它等价于:int b6=1,2,3;。中数据的类型必须与所指定的数据类型一致。在C语言中,数组元素的下标值依次为0、1、2、,在n个元素组成的一维数组中,最后一个元素的下标为n-1。,课件制作:刘达明 023-66834110,一维数组的初始化说明(续):,第一节 一维数组,(第四章 指针与数组),9/113,C语言规定对数组进行置初值时,如果是静态存储(static为关键字)数组和外部存储(extern)数组。在数组不赋初值时,系统会对所有数组元素自动赋以0值或0值。如:static int a3;等价于 static int
9、 a3=0,0,0;。如果只定义int a5;而不赋初值时,则各元素的值是不确定的。对数组的全部元素都赋0为初值,可以写成:int a5=0,0,0,0,0;而不能写成:int a5=0*5;。可以只给数组中的前面一部分元素赋初值,后面没有赋初值的元素系统自动赋以0值或0值。如:int a5=1,2,3;等价于:int a5=1,2,3,0,0;也等价于:int a=1,2,3,0,0;。,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),10/113,1、指向基本数据类型变量的指针变量,二、指向一维数组的指针变量,int i,j,k,*i_pointer=
10、执行i_pointer+后,i_pointer已不再指向i了,而是指向了下一个j,但在这里这样用无意义。,int i;给变量i分配2个字节的存储单元i=3;在i的存储单元中的值为3。,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),11/113,指向基本数据类型变量的指针变量(续1),int i,*i_pointer;i_pointer=,指针与指针变量通过 则:&*p等价于&(*p)或&a都表示变量a的地址。而*&a则与*p等价,都表示变量a的内容。,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),12/113,指针
11、变量的运算:指针变量是一个变量,因此可以进行某些运算。但指针的本质是一个地址,其运算具有一些特别的性质,不能用普通变量的规则运算来作为指针运算的方式。指针变量加(减)一个整数的算术运算:只有:加、减(+、-、+、-)运算。+、+代表指针前移,-、-代表指针后移。指针变量每加(或减)1,就指向它指定的数据类型的下一个(或上一个)元素的位置。C语言规定,一个指针变量加(减)一个整数并不是简单地将指针变量的原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加(减)。如:p+i(p是指针变量,i是整数),代表的地址计算:p+c*i(c为指针变量所指向的数据
12、类型所占内存的字节数)。运算:p+、p-,+p,p-=i,p+=i,p=p+i,p=p-i等(这里i表示整型数据)。这些运算的结果仍为指针。如:int a,b,c,d,*p;p=)时,p2就指向变量e,相当于p=&e。两个指针变量之间的算术运算:只有减法(-)运算。只有指向同一数组的两个指针变量之间才能进行这种运算,否则两个指针变量之间的运算毫无意义(但在程序中不会报错)。指向同一数组的两个指针变量之差,是两个指针之间的元素个数。结果为个数。,指向基本数据类型变量的指针变量(续2),课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),13/113,如:p1=表
13、示p不指向任何变量,而是指向地址为0的单元,表明p是空指针。也就是说,有效数据的指针不指向0单元。注意:空指针与未对p赋值是两个不同概念。空指针p是对p赋0值,而未对p赋值并不等于p无值,只是它是一个无法预料的值,这就可能影响有用单元。因此在引用指针变量之前,一定要对它赋值。任何指针变量或地址都可以与NULL作相等或不相等的比较。如:p=NULL,如果结果为真(1),表明p为空指针,否则p不是空指针。,指向基本数据类型变量的指针变量(续3),课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),14/113,数组是同一类型变量组成的有序集合,其本身存储的是各种类
14、型的数据;而指针是专门用来存放其它变量的地址,当一个指针变量指向某一数组时,在对该数组元素的存取方式上,通过数组的下标与通过数组指针的运算访问数组元素是十分相似的。一个变量可以有一个地址相对应,而一个数组包含若干个元素。每个数组元素都在内存中占用存储单元,同样有一个地址相对应。指针变量可以指向变量,所以也可以指向数组和数组元素,即把数组起始地址或某一元素的地址放到一个指针变量中。所谓数组的指针是指数组的起始地址,而数组元素的指针是指数组元素的地址。实际上,定义的数组名就是一个指针,表示数组的首地址,是一个固定值,一个常量,与定义的指针变量是不同的。对数组的访问,即对数组元素的操作,可使用:下标
15、法,即直接使用数组的下标方式,如:a0、a4等;和指针法,即通过指向数组元素的指针找到所需的数组元素。指向数组元素的指针 定义:int a10,*p;数组元素相当于一个变量,因此每个元素的地址都可以赋给对应类型的指针变量。如:p=则表示指针变量p指向了数组的第1个元素。这时指针变量p与数组a就建立了关系,我们可以通过指针变量p访问数组a了。注意:数组的类型与指针变量的类型应一致。,2、指向一维数组的指针,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),15/113,C语言规定数组名代表数组的首地址,即第0号元素的地址。因此:当定义int a10,*p;时,
16、赋值语句:p=”的作用是将数组a的首地址(即a0的地址)赋给指针变量p,而不是赋给*p。,指向数组的指针,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),16/113,有如下定义:int a20,*p;如果p的初值赋值为:p=a;或p=。因此*(p+i),*(a+i),ai是等价的。注意:在C编译时,对数组ai的处理实际上就是处理成*(a+i)的,即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。因此*(a+i)的表示法比ai的表示法在程序执行时要快得多。由此可知,下标运算符实际上是变址运算符,即将ai按a+i计算地址,然后找出此地
17、址单元中的值。,通过指针引用数组元素,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),17/113,指向数组的指针变量也可以带下标。如:pi与*(p+i)是等价的,也与*(a+i)和ai是等价的。注意:pi是数组元素的值而不是指针。因此*(p+i),*(a+i),ai,pi等价。如果:int a10,*p;p=则:p2表示a6元素,p-3表示a1元素。,引用数组元素的三种方法,引用数组元素的方法分为两大类:下标法(如:a2)和指针法(又有两种方式:通过数组名计算数组元素地址,找出元素的值,如:*(a+2);和用指针变量指向数组元素,如:*(p+2)。,例
18、4.1 有一个整型数组,共10个元素,输出数组中的全部元素。(详见教材P107),下标法:#include main()int a10,i;for(i=0;i10;i+)scanf(“%d”,通过数组名计算元素地址:#include main()int a10,i;for(i=0;i10;i+)scanf(“%d”,通过指针变量操作数组元素:#include main()int a10,i,*p;for(i=0;i10;i+)scanf(“%d”,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),18/113,在例4.1中,所使用的三种方法的比较如下:第1和
19、第2种方法执行效率是相同的,都是将ai转换为*(a+i)处理。这两种方法找数组元素费时较多。第3种方法比第1和第2种方法执行快,用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的,它是有规律地改变地址值的。用下标法比较直观,能直接知道是第几个元素。如a5表示第5号元素(从0开始)。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪个元素。如进行多次p+操作后p值已改变,就要分析当前指针变量p指向哪个元素。但使用指针变量方式在复杂的数据结构中就显示出它的灵活性。,使用指针变量对数组操作时应注意的问题,指针变量可以实现使本身的值改变,而数组名是表示一个固定不
20、变的数组首地址。如:int a10,*p=a;则,执行p+(或p+=1或p=p+1)后,p就指向下一个元素a1。当定义int a10,*p;p=操作,p就指向了数组a以后的内存单元了,而不再指向数组a了。如果引用a10,C系统不作为非法,而是转换为*(a+10)处理,但它已超出数组a的范围了,因此不能得到预期的结果。所以,在使用数组a或指针变量p时,应保证数组在有效范围内引用,保证指针变量是指向数组中有效的元素的。,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),19/113,特别注意指针变量的当前值。如以下程序:,指针变量的运算 p+(或p+=1),使p
21、指向下一元素,如果p的初值为数组a的首地址的话,这时p就指向a1元素了。若再执行*p,就取出了a1的值。*p+,由于+和*同一优先级,结合方向为自右而左,因此它等价于*(p+)。作用是,#include main()int a10,i,*p;p=a;for(i=0;i10;i+)scanf(“%d”,p+);printf(“n”);for(i=0;i10;i+,p+)printf(“%6d”,*p);这是错误的程序。第一个循环中的p+运行完后使它不指向数组a了。,#include main()int a10,i,*p;p=a;for(i=0;i10;i+)scanf(“%d”,p+);prin
22、tf(“n”);p=a;for(i=0;i10;i+,p+)printf(“%6d”,*p);这是正确的程序。,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),20/113,先得到p所指向的元素值a0(如果p的初值为数组a首地址的话,即*p),然后再将p+1的值赋给p。如果这时再执行*p的话,就是a1的值了。*(p+)与*(+p)作用不同。*(p+)相当于先*p,然后再p+。而*(+p)相当于先p+,然后再*p。如果p=时,则有:*(p+)相当于ai+,先取*p,再求p+,结果为ai,而p指向元素ai+1。*(p-)相当于ai-,先取*p,再求p-,结果为
23、ai,p指向数组元素ai-1。*(+p)相当于a+i,先求p+,再取*p,结果为ai+1,p指向元素ai+1。*(-p)相当于a-i,先求-p,再取*p,结果为ai-1,而p指向元素ai-1。,y=*p+5;/*表示把a0的值加5并赋给y*/y=+*p;/*表示*p的内容加上1之后赋给y。即:y=a0+1,+*p相当于+(*p)*/y=*p+;/*相当于y=*x;p+;*/将+和-运算符用于数组指针变量十分有效,可以使数组指针变量自动向前或向后移动,指向下一个或上一个数组元素。但如果不小心,很容易弄错。因此在用如*p+形式的运算时,一定要弄清楚是先取p所指向的元素值,还是先使p加1。例如:想输
24、出100个元素,可以用以下代码:,定义int a10,y,*p=a;则:,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),21/113,例4.2 用冒泡法(也称起泡法、还称交换法)对10个数排序。解:冒泡法的思想是:将相邻的两个数进行比较,将小的调到前头。,三、一维数组程序举例,排序过程:(1)比较第一个数与第二个数,若为逆序a0a1,则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置(
25、3)重复上述过程,共经过n-1趟冒泡排序后,排序结束 注:在第一趟比较中要进行N1次两两比较,在第J趟比较中要进行NJ次比较。,p=a;while(pa+100)printf(“%6d”,*p+);,p=a;while(pa+100)printf(“%6d”,*p);p+;,或,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),22/113,其N-S图如下:,例4.2(续1),课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),23/113,例4.2(续2),#include main()int a11,i,j,t;prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针与数组 指针 数组 PPT 课件
链接地址:https://www.31ppt.com/p-5515998.html