[政史地]数组类型与指针类型-m课件.ppt

上传人(卖家):晟晟文业 文档编号:5102422 上传时间:2023-02-11 格式:PPT 页数:61 大小:207.52KB
下载 相关 举报
[政史地]数组类型与指针类型-m课件.ppt_第1页
第1页 / 共61页
[政史地]数组类型与指针类型-m课件.ppt_第2页
第2页 / 共61页
[政史地]数组类型与指针类型-m课件.ppt_第3页
第3页 / 共61页
[政史地]数组类型与指针类型-m课件.ppt_第4页
第4页 / 共61页
[政史地]数组类型与指针类型-m课件.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、C语言提供的基本数据类型,大致分为整型、实型、字符型等三大类C语言提供构造新类型的方法,可以在已有数据类型的基础上构造新的数据类型,这种新的类型称为构造类型,根据构造方法的不同分为数组、指针、结构、联合等四种 问题:假如现在班级里有问题:假如现在班级里有100个人,要求用个人,要求用C语言程序来语言程序来实现求这实现求这100个人的数学成绩之和,(个人的数学成绩之和,(想一想怎么写?)想一想怎么写?)使用数组的目的:使用数组的目的:为了解决这种大量同种类型数据的存储与使用问题为了解决这种大量同种类型数据的存储与使用问题 数组是由一系列同类型的元素(Element)所组成的集合,数组变量名就一个

2、数组中元素的数据类型可以是基本类型,也可以是构造类型,若元素的类型是整型则称为整型数组,若元素类型是结构体类型则称为结构体数组,若元素类型是指针类型则称为指针数组,若成员的类型是数组则称为二维数组(重点掌握)(重点掌握)当数组中元素的类型不是数组,而是基本类型,或者结构,指针等构造类型时,称为一维数组一维数组变量的定义的格式一维数组变量的定义的格式(掌握)(掌握)元素数据类型 数组变量名常量或数值表达式注意注意l常量的值表示了数组的大小即元素的个数,必须为正整型常量的值表示了数组的大小即元素的个数,必须为正整型(记住:这里数组的大小一定不能是个变量)(记住:这里数组的大小一定不能是个变量)。l

3、如果数组大小是个数值表达式的值是小数,一定先取整如果数组大小是个数值表达式的值是小数,一定先取整,int int a7/2 a7/2 即即 a3a3 l数组变量名需要符合标识符命名的要求,不能与已有的变量数组变量名需要符合标识符命名的要求,不能与已有的变量名或系统关键字相同。名或系统关键字相同。#include void main()int a5;int i;for(i=0;i5;i+)printf(please input the%d data:,i+1);scanf(%d,&ai);printf(n);for(i=0;i5;i+)printf(%dn,ai);void main()int

4、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);void main()int value;int a5=1,2,3,4,5;int i;int flag=0;scanf(%d,&value);for(i=0;i5;i+)if(value=ai)flag=1;break;if(flag=1)printf(exists);else printf(not exi

5、st);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循环遍历输出数组的内容循环遍历输出数组的内容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;as

6、mallIndex=temp;利用数组获得20项Fibonacci数列元素,即后一项为前两项之和,开始两项为1,可得序列为1,1,2,3,5,8,#include 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);每个成员要有存储空间且每个成员可以通过下标找到存储空间的位置。分配连续的一块内存区域能够存放得下所有的元素,然后将数组成员按下标顺序连续存放,零号成员存放在这块内存区的最前面,所以数数组的实质是内存中一段连续的存储区域组的实质是内存中一段连续的存储区域,假设内存地

7、址为start,由于每个成员所占的存储空间大小是相同的,假设为m个字节,这时i号成员的内存地址就等于start+m*i。定义了一个定义了一个10个元素的个元素的int数组,占据的内存空间,数组,占据的内存空间,10*4个字节,每个字节,每4个字节空间就代表着一个元素个字节空间就代表着一个元素越界?越谁的界?当然是内存。一个变量存放在内存里,你想读的越界?越谁的界?当然是内存。一个变量存放在内存里,你想读的是这个变量的内存空间,结果却读过头了,很可能读到了另一个变是这个变量的内存空间,结果却读过头了,很可能读到了另一个变量的头上。这就造成了越界。量的头上。这就造成了越界。数组的访问越界问题,看如

8、下代码数组的访问越界问题,看如下代码:int arr10,i;for(i=1;i=10;i+)printf(“%d”,arri);这里访问数组的元素已经越界了!但是编译器不提示错误,即这里访问数组的元素已经越界了!但是编译器不提示错误,即编译器不进行数组访问越界的检查。但这明明是个错误,所以编译器不进行数组访问越界的检查。但这明明是个错误,所以一个隐秘的错误就包含到了你的程序中,这是非常可怕的事,当一个隐秘的错误就包含到了你的程序中,这是非常可怕的事,当程序运行起来后,有可能会出现莫名奇妙的错误。错误表现不定程序运行起来后,有可能会出现莫名奇妙的错误。错误表现不定有问题的代码有问题的代码为什么

9、数组访问越界会造成莫名其妙的错误?为什么数组访问越界会造成莫名其妙的错误?前面我们讲过数组的前面我们讲过数组的实质是一段连续的内存空间。然后,我们可以通过指定数组下标来访实质是一段连续的内存空间。然后,我们可以通过指定数组下标来访问这块内存里的不同位置。因此,当你的下标过大时,访问到的内存问这块内存里的不同位置。因此,当你的下标过大时,访问到的内存就不再是这个数组就不再是这个数组“份内份内”的内存。你访问的,将是其它变量的内存了。的内存。你访问的,将是其它变量的内存了。举个例子数组就像一排的宿舍,假设有举个例子数组就像一排的宿舍,假设有5间,你住在第间,你住在第2间;间;如果你晚上喝多了,回来

10、时进错了房间,只要你进的还是这如果你晚上喝多了,回来时进错了房间,只要你进的还是这5间,间,那倒不会有大事,可是若是你那倒不会有大事,可是若是你“越界越界”了。竟然一头撞入第了。竟然一头撞入第6间间这第这第6间会是什么?很可能它是走廊的尽头,结果你一头掉下楼,间会是什么?很可能它是走廊的尽头,结果你一头掉下楼,这在生活中很不幸,可对于程序倒是好事了,因为错误很直接这在生活中很不幸,可对于程序倒是好事了,因为错误很直接(类似直接死机),你很容易发现。可是,(类似直接死机),你很容易发现。可是,如果第如果第6间是?据我所知,第间是?据我所知,第6间可能是厕所,也可能是女生宿舍。间可能是厕所,也可能

11、是女生宿舍。所以数组访问下标越界问题,程序会表现出不可预知的错误。所以数组访问下标越界问题,程序会表现出不可预知的错误。这个问题:怎样解决?这个问题:怎样解决?注意:注意:p-2中的中的2是地址偏移量,表示是地址偏移量,表示p的内容的内容-2个元素大小的内存空间个元素大小的内存空间有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。a数组已经按照从小到大的顺序排列好,加入数保持有序的方法是先将所有大于该数的元素后移一格,再将该数放到这些数的前面。A数组X.一维数组实参采用地址传递方式,提供给形参的不是数组的所有元素值,而是一个简单的数组零号元素的地址。通过形参中的地址可以找到

12、一维数组实参的所有元素的存储空间,函数中可以直接访问这些元素空间。为了函数可以检查越界错误,可以将数组大小作为函数参数一并传递。形参定义方式可以是一维数组定义形式,也可以省略定义中的数组大小,还可以直接定义为指针类型,这三种方式含义是一样的。调用函数时提供的一维数组实参就是待传递数组的第一元素的地址,一般直接将数组名作为实参。编写一个函数实现将一维数组的内容倒置,该功能前面已进行过讲解,请自行写一下试一试【例【例5.8】编写一个自定义函数可以查找任意数组中是否存在一个特定数据。】编写一个自定义函数可以查找任意数组中是否存在一个特定数据。#include int search(int s10,i

13、nt 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+)scanf(%d,&ai);printf(Enter the element:n);scanf(%d,&e);if(search(a,e)=1)printf(The element%d exists in the array.,e);else printf(Can not find the element%d.,e);具有两个下标

14、的数组称为二维数组 通常,二维数组可看成是数学中的矩阵,因此,习惯上将第一维下标称为行标,第二维下标称为列标。元素类型 数组名常量表达式1常量表达式2=初始值表;l元素类型是构成数组的数据成员的类型。l常量表达式1和常量表达式2分别代表行标和列标的大小,它们均从0开始。二维数组实质:我们可以把一个二维数组a看作是一种特殊的一维数组,而这个一维数组的元素又是一个一维数组。例如a34 a0=a00,a01,a02,a03 a1=a10,a11,a12,a13 a2=a20,a21,a22,a23 a0,a1,a2分别是三个一维数组的数组名,实际的二维数组存储也是按一维数组的存储方式存储的。这里的二

15、维数组默认按照行的顺序存储(1)按维给二维数组赋初值,(推荐使用,清楚直观)(推荐使用,清楚直观)例如:int A34=1,2,3,4,5,6,7,8,9,10,11,12;(2)可以将所有数据写在一个花括号内,按存放顺序连续赋初值(此方法编程中不推荐使用)(此方法编程中不推荐使用)例如:int A34=1,2,3,4,5,6,7,8,9,10,11,12;(3)如果能提供所有数组元素的初始值,则定义数组时只需要提供第二维大小,第一维可以省略 例如:int A4=1,2,3,4,5,6,7,8,9,10,11,12;字符串常量使用双引号界定,字符串常量的存储是采用连续的字符后跟一个结束标志零(

16、即字符0)的方法,这样,提供一个字符串只需提供该串的串首指针(地址)即可 C Language在内存保存的情况如下 【例5.20】比较两个字符串的大小#include int mystrcmp(char*s1,char*s2)for(;*s1!=NULL&*s2!=NULL;s1+,s2+)if(*s1!=*s2)break;return*s1-*s2;void main()char s1=Hello;int diff;diff=mystrcmp(s1,Hello);if(diff=0)printf(Two strings are equal.);else if(diff0)printf(A

17、is greater than B);else printf(A is less than B);是用于保存地址的变量。是用于保存地址的变量。基类型*指针变量名=初始化值;基类型是指针所指向的内存单元的类型。指针变量名前面必须通过*号标识,不能与保留字和其它变量同名。初始化值是内存单元的地址,该内存单元必须是基类型,省略时指针变量中为随机值。NULL是空指针常量,值为零,可以作为作为指针变量的初值。指针变量的合法的定义形式:int*p1;float*p2;int i,j,*p3=&i,*p4=p3;float*p5,f;下面是非法的定义形式:int*p1=30;int i,*p2=i;int*

18、p1,*p3=&p1;指针的操作有两类:直接使用指针本身作为数据值进行操作得到的结果仍然是指针,间接使用指针访问指针所指向的内存单元得到的结果是内存单元的值。:&用于取出变量的地址,=则向指针变量中传送一个指针值,int i,*p1;p1=&i;。:通过输出函数printf将指针数据显示出来,格式符是%p,printf(%p,p1);。间接操作指针是指通过指针访问所指向的内存单元的过程具体步骤如下:l1)先通过指针的直接操作计算得到内存单元的地址l2)再通过间接访问运算符*访问该地址所指向的内存单元,int i,*p1=&i;*p1=100;如果要在例5.27中显示&*p1的结果该使用指针格式

19、符还是整型格式符?由于p1指向了整型变量j,*p1的结果是间接访问变量j,&*p1的结果则是取变量j的地址,即:&*p1=&(*p1)=&(j)=&j=p1 因此结果是指针,应该使用指针格式符%p。如果要在中显示*&i的结果该使用指针格式符还是整型格式符?&i的结果是整型变量i的地址,*&i的结果间接访问&i指针所提向的整型变量i,即 *&i=*(&i)=*(p2)=&p2=i 因此结果是整型值,应该使用整型格式符%d。前者是先做+再做*运算,后者则相反。先看前者。*p1+相当于*(p1+),该表达式的含义是首先取*p1的值(即变量j的值60),然后再有p1=p1+1。再看后者。由于指针变量p

20、1指向j,故*p1实际上就是j,因此就有以下等式成立:(*p1)+=j+(*p1)+是先取*p1的值(即j的值,初值为60),然后再有j的值从60增加到了61。&p1的结果是指针变量p1的地址,因此可以使用指针格式符%p来显示。由于该地址的基类型是指针类型,因此该地址是二级指针,即指向的内存单元是指针类型。该指针不能赋值给指针变量p2,因为p2的基类型是整型而不是指针类型。【例5.28】请给出下面程序的运行结果。#includevoid main()int i=50,j=60,*p,*p1=&i,*p2=&j;if(ij)p=p1;p1=p2;p2=p;printf(%d%dn,i,j);pr

21、intf(%d%dn,*p1,*p2);运行结果如下:50606050 int A10,*p=A,*q,i=5;整型指针变量p初始化时赋值为一维数组名A,即A数组中第一元素A0的地址,*p的结果是间接访问p所指向内存单元,即A0。同上,p的结果是A0的地址,p+i的作用是调整指针,结果是数组元素A0后面排在第i个位置的数组元素的地址,即Ai的地址,*(p+i)的结果是间接访问指针p+i所指向的内存单元Ai。int A10,*p=A,*q,i=5;整型变量i初始化为5,&Ai的结果是数组成员A5的地址,q=&Ai;语句的作用是将A5的地址赋值给指针变量q。如前3)所述,指针变量q通过赋值得到了A

22、5的地址,q+的结果是q加1之前的地址值,仍然是A5的地址,*(q+)的结果是间接访问指针q+所指向的内存单元A5。最后指针变量q会由于+运算增1指向A6的地址,但这不会影响*(q+)的结果。int A10,*p=A,*q,i=5;如前3)所述,指针变量q通过赋值得到了A5的地址,+q的结果是修改q,使指针变量q加1,这时q指向A5的下一个单元A6,所以结果是A6的地址,*(+q)的结果是间接访问指针+q所指向的内存单元A6。数组名A表示了数组中第一元素的地址,即A0的地址,A+i是指针操作,结果是数组中A0元素之后排在第i个位置的数组元素的地址,即Ai的地址,*(A+i)的结果是间接访问指针

23、A+i所指向的内存单元Ai。int A10,*p=A,*q,i=5;指针变量名p后跟下标操作是一种合法的操作,表示间接访问指针p+i所指向的内存空间,由于p初始化为A0的地址,p+i的结果是A0后第i个数组成员Ai的地址,因此,pi的结果是间接访问数组成员Ai。地址传递方式是将实参指针赋值给形参指针变量,形参指针变量和实参指针所指向的内存单元是同一个,通过间接访问形参指针变量就能使用该内存单元,数组类型的函数参数采用这种传递方式。使用指针变量作为函数参数可以修改主程序中的内存单元,通过这种方式可以使函数返回多个值,方便了函数的使用。如果修改的主程序中的内存单元是指针类型的,则函数参数需要使用二

24、级指针形参。函数的返回值也可以是指针,指针所指向的单元必须在函数调用结束后仍然存在,不要返回函数中建立的局部变量的地址。【例5.29】指针参数的使用。#include void swap(int*p1,int*p2)/*注意1*/int temp;temp=*p1;*p1=*p2;*p2=temp;void main()int i=50,j=60;if(ij)swap(&i,&j);/*注意2*/printf(%d%d n,i,j);我们来理解一下什么是指针数组我们来理解一下什么是指针数组 一个数组的元素都是指针型,则称为指针数组。指针数组的定义形式为:类型名 *数组名数组长度;例如:int*

25、p4;【例】有若干个字符串,输出其中最长的字符串。#include string.h#include main()main()char char *p=teacher,book,pascal,hellop=teacher,book,pascal,hello,and,computer and,computer design;design;char char*q;q;int int i;i;q=p0;q=p0;for(i for(i=1;i6;i+)=1;istrlen(q if(strlen(pi)strlen(q)q=pi q=pi;printf(%sn,q printf(%sn,q););函数指针是指函数代码在内存中的开始地址。函数名就是一种函数指针,在函数名后跟一对园括号界定的若干个实际参数就可以从函数代码的开始地址执行函数,称为函数的调用.返回值类型 (*函数指针变量名)(参数类型表);参数类型表可以省略,表示该函数指针变量是无参的,这种参数格式的函数指针变量可以接收任意参数格式的函数指针,即对函数的参数个数、顺序及类型均没有要求。返回值类型可以是void表示无返回值。

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文([政史地]数组类型与指针类型-m课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|