数组类型与指针类型m.ppt
《数组类型与指针类型m.ppt》由会员分享,可在线阅读,更多相关《数组类型与指针类型m.ppt(61页珍藏版)》请在三一办公上搜索。
1、第5章 数组类型与指针类型,5.1 数据类型的构造,*5.3 指针类型,*5.2 数组类型,结束放映,系统预先提供的类型:C语言提供的基本数据类型,大致分为整型、实型、字符型等三大类用户新定义的类型:C语言提供构造新类型的方法,可以在已有数据类型的基础上构造新的数据类型,这种新的类型称为构造类型,根据构造方法的不同分为数组、指针、结构、联合等四种,5.1 数据类型的构造,5.2 数组类型,为什么要用数组?(重点理解),问题:假如现在班级里有100个人,要求用C语言程序来实现求这100个人的数学成绩之和,(想一想怎么写?),使用数组的目的:为了解决这种大量同种类型数据的存储与使用问题,5.2 数
2、组类型,数组类型的定义数组是由一系列同类型的元素(Element)所组成的集合,数组变量名就一个数组中元素的数据类型可以是基本类型,也可以是构造类型,若元素的类型是整型则称为整型数组,若元素类型是结构体类型则称为结构体数组,若元素类型是指针类型则称为指针数组,若成员的类型是数组则称为二维数组,一维数组(重点掌握)当数组中元素的类型不是数组,而是基本类型,或者结构,指针等构造类型时,称为一维数组一维数组变量的定义的格式(掌握)元素数据类型 数组变量名常量或数值表达式注意常量的值表示了数组的大小即元素的个数,必须为正整型(记住:这里数组的大小一定不能是个变量)。如果数组大小是个数值表达式的值是小数
3、,一定先取整,int a7/2 即 a3 数组变量名需要符合标识符命名的要求,不能与已有的变量名或系统关键字相同。,方式1:数组只能在定义的同时对数组整体进行赋初值(而普通变量可以先声明后初始化)格式:数据类型 数组变量名元素个数=元素1初值,元素2初值,.初值用一对括起来。相邻的值之间用逗号隔开例如:int arr10=9,8,7,6,5,4,3,2,1,0;上面定义了一个一维数组,名字为arr,共10个元素。元素的类型为int,初始值为从9到0。以下方式是错误的:int arr10;arr10=9,8,7,6,5,4,3,2,1,0;/errorArr=100;/error,问题:前面我们
4、讲了怎样定义一个一维数组的格式,那么定义完了如何给这个一维数组中的每个元素赋值呢?它的赋值方式和一个普通变量的赋值有什么区别?,方式1注意:使用方式1给数组整体赋值,初值的个数不能超过数组的大小(即可以小于但觉不能大于)int arr10=9,8,7/允许你这里定义了数组为10个元素,但你可以给它赋少于10个的初始值。但至少有一个,那么那些没有得到初始值的元素的值又是多少呢?他们则被编译器初始化为0,但是如果只定义数组,没有对其进行任何初始化,局部变量则是未定义的值(即不可预测的值),全局变量将被编译器自动初始化为0,方式2:先定义,后初始化时只能针对数组中单个的元素进行赋值,而不能进行整体赋
5、值例如 int arr10;arr0=9;arr1=8;.这里需要访问数组中的每个元素,所以需要使用下标来区分数组中的每个元素,下标只能是整形,C语言规定,访问数组中的元素下标从0开始,即第一个元素是 数组名0,方式3:用一个数组给另一个数组赋值例如:int a5=1,2,3,4,5 int b5;怎样用a初始化数组b呢?想一想怎样用程序实现,能否自行编写出来。(提示:使用for循环实现)以下是错误的情况:b=a;/error,一维数组的相关操作举例 例 1:要求从键盘输入5个整数并存储到一个数组中。然后将此数组的内容进行打印输出(怎样实现?想一想),#include void main()i
6、nt a5;int i;for(i=0;i5;i+)printf(please input the%d data:,i+1);scanf(%d,例2 求上一题目中数组a中元素的最大值的下标,并打印输出此下标和对应的元素的值(怎样修改),void main()int maxIndex=0;int a5=1,2,3,4,5;int i;for(i=0;i amaxIndex)maxIndex=i;printf(the maxIndex is%dn,maxIndex);printf(the array max value is%dn,amaxIndex);,例3 要求实现在一个数组中查找一个值,这个
7、值由用户输入,判断此值是否在数组中(怎样实现),void main()int value;int a5=1,2,3,4,5;int i;int flag=0;scanf(%d,例4 要求实现对一个数组元素进行逆序存放(怎样实现)例如 int a5=1,2,3,4,5 逆序存放后内容变成 a5=5,4,3,2,1,void main()int a5=1,2,3,4,5;int i=0;int j=4;int temp;while(i j)temp=ai;ai=aj;aj=temp;i+;j-;/下面内容请自行编写使用for循环遍历输出数组的内容,例5 要求使用选择法对一个数组元素进行从小到大的排
8、序,最后将排序后的结果进行输出(怎样实现?)例如 int a5=5,2,4,3,1 排序后内容变成 a5=1,2,3,4,5,void main()int i,j,smallIndex=0;int temp;int a5=5,2,4,3,1;for(i=0;i4;i+)smallIndex=i;for(j=i+1;j5;j+)if(aj asmallIndex)smallIndex=j;temp=ai;ai=asmallIndex;asmallIndex=temp;,例6 利用数组获得20项Fibonacci数列元素,即后一项为前两项之和,开始两项为1,可得序列为1,1,2,3,5,8,#in
9、clude void main()int i,f20=1,1;for(i=2;i=19;i+)fi=fi-2+fi-1;for(i=0;i=19;i+)printf(%d/n,fi);,数组的存储(掌握)数组的存储涉及两个问题:每个成员要有存储空间且每个成员可以通过下标找到存储空间的位置。数组的存储方法:分配连续的一块内存区域能够存放得下所有的元素,然后将数组成员按下标顺序连续存放,零号成员存放在这块内存区的最前面,所以数组的实质是内存中一段连续的存储区域,假设内存地址为start,由于每个成员所占的存储空间大小是相同的,假设为m个字节,这时i号成员的内存地址就等于start+m*i。,定义了
10、一个10个元素的int数组,占据的内存空间,10*4个字节,每4个字节空间就代表着一个元素,数组访问越界问题:,越界?越谁的界?当然是内存。一个变量存放在内存里,你想读的是这个变量的内存空间,结果却读过头了,很可能读到了另一个变量的头上。这就造成了越界。数组的访问越界问题,看如下代码:int arr10,i;for(i=1;i=10;i+)printf(“%d”,arri);,这里访问数组的元素已经越界了!但是编译器不提示错误,即编译器不进行数组访问越界的检查。但这明明是个错误,所以一个隐秘的错误就包含到了你的程序中,这是非常可怕的事,当程序运行起来后,有可能会出现莫名奇妙的错误。错误表现不定
11、,有问题的代码,数组访问越界问题:,为什么数组访问越界会造成莫名其妙的错误?前面我们讲过数组的实质是一段连续的内存空间。然后,我们可以通过指定数组下标来访问这块内存里的不同位置。因此,当你的下标过大时,访问到的内存就不再是这个数组“份内”的内存。你访问的,将是其它变量的内存了。举个例子数组就像一排的宿舍,假设有5间,你住在第2间;如果你晚上喝多了,回来时进错了房间,只要你进的还是这5间,那倒不会有大事,可是若是你“越界”了。竟然一头撞入第6间这第6间会是什么?很可能它是走廊的尽头,结果你一头掉下楼,这在生活中很不幸,可对于程序倒是好事了,因为错误很直接(类似直接死机),你很容易发现。可是,如果
12、第6间是?据我所知,第6间可能是厕所,也可能是女生宿舍。所以数组访问下标越界问题,程序会表现出不可预知的错误。,这个问题:怎样解决?,数组与指针变量(掌握)数组名是数组中第一个元素的内存地址即首地址,是地址。指针变量是存放某种类型变量地址的变量,所以指针变量能保存数组的首地址,那么这时指针变量就指向了这个数组 前面已经介绍了使用下标访问数组元素,使用指针变量也可以访问数组元素。分为两步:(1)建立指针变量,取得数组中第一个元素的地址;(2)重复通过指针加1来获得下一个数组元素的指针。第一步获取指针可以通过两种方式一种是利用取址运算(&)获得元素的指针,另一种是直接通过数组名获得第一个元素的指针
13、,采用指针方式访问数组元素求Fibonacci数组中前20个项。#includevoid main()int i,f20=1,1,*p;/*通过*定义指针变量p/p=,注意:p-2中的2是地址偏移量,表示p的内容-2个元素大小的内存空间,例 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。a数组已经按照从小到大的顺序排列好,加入数保持有序的方法是先将所有大于该数的元素后移一格,再将该数放到这些数的前面。,新元素X,程序如下:#include void main()int a11=1,4,6,9,13,16,19,28,40,100;int i,number;printf(
14、original array is:n);for(i=0;i=0;i-)if(ainumber)ai+1=ai;else break;ai+1=number;for(i=0;i11;i+)printf(%5d,ai);printf(n);,一维数组作为参数(掌握)一维数组实参采用地址传递方式,提供给形参的不是数组的所有元素值,而是一个简单的数组零号元素的地址。通过形参中的地址可以找到一维数组实参的所有元素的存储空间,函数中可以直接访问这些元素空间。为了函数可以检查越界错误,可以将数组大小作为函数参数一并传递。形参定义方式可以是一维数组定义形式,也可以省略定义中的数组大小,还可以直接定义为指针类
15、型,这三种方式含义是一样的。调用函数时提供的一维数组实参就是待传递数组的第一元素的地址,一般直接将数组名作为实参。,例 编写一个函数实现将一维数组的内容倒置,该功能前面已进行过讲解,请自行写一下试一试,【例5.8】编写一个自定义函数可以查找任意数组中是否存在一个特定数据。#include int search(int s10,int x)int i;for(i=0;i10;i+)if(si=x)break;if(i10)return 1;else return 0;void main()int a10,i,e;printf(Enter the array:n);for(i=0;i10;i+)s
16、canf(%d,二维数组(理解)具有两个下标的数组称为二维数组 通常,二维数组可看成是数学中的矩阵,因此,习惯上将第一维下标称为行标,第二维下标称为列标。二维数组变量的定义:元素类型 数组名常量表达式1常量表达式2=初始值表;说明:元素类型是构成数组的数据成员的类型。常量表达式1和常量表达式2分别代表行标和列标的大小,它们均从0开始。,二维数组实质:我们可以把一个二维数组a看作是一种特殊的一维数组,而这个一维数组的元素又是一个一维数组。例如a34 a0=a00,a01,a02,a03 a1=a10,a11,a12,a13 a2=a20,a21,a22,a23 a0,a1,a2分别是三个一维数组
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 类型 指针
链接地址:https://www.31ppt.com/p-6297468.html