欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《指针与数组》PPT课件.ppt

    • 资源ID:5515998       资源大小:2.06MB        全文页数:113页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《指针与数组》PPT课件.ppt

    第4章 指针与数组,第一节 一维数组第二节 二维数组第三节 字符数组与字符串第四节 指针数组指针小结,C语言程序设计 龙昭华主编,1/113,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),2/113,迄今为止,我们使用的都是属于基本类型,如:整型、字符型、实型等类型的数据。而C还提供了构造类型,如:数组类型、结构体类型、公用体类型等。构造类型数据是由基本类型数据按一定规则组成的,因此有些书称它们为“导出类型”。在程序设计中,常常需要处理大量同类型的相关数据,如每个学生的成绩记录,多个相同类型数据的排序等。这类数据在计算机语言中可以通过数组来表示。所谓数组就是具有相同数据类型的有序集合。在C语言中,数组具有以下几个特点:数组的所有元素使用一个共同的名字,称为数组名,数组名使用标识符来表示。每个数组元素的使用由数组的下标来确定。数组元素的个数必须在定义时确定,程序中不可改变。在C语言中,数组下标是从0开始,到数组元素个数减1结束的。同一数组中的每一元素具有相同的数据类型(可以是基本类型或构造类型等)。同一数组在内存中占据一段连续的存储单元。数组中元素的作用相当于简单变量。数组必须先定义后使用。,课件制作:刘达明 023-66834110,一、一维数组的定义和引用,第一节 一维数组,(第四章 指针与数组),3/113,1、一维数组的定义 一维数组是指只有一个下标的数组元素所组成的数组。一维数组的定义方式为:类型说明符 数组名常量表达式;例如:int a10;它表示数组名为a,此数组有10个元素,分别为a0、a1、a2、a3、a4、a5、a6、a7、a8、a9。又如:存放30个学生的数学成绩,用一维数组定义如下:int grade30;其元素分别为:grade0,grade29共30个。,课件制作:刘达明 023-66834110,一维数组的定义说明,第一节 一维数组,(第四章 指针与数组),4/113,数组名定名规则和变量名相同,遵循标识符定名规则。它表示各数组元素的统一名字,用以唯一标识数组。数组名后是用方括号的常量表达式,不能用圆括号代替。如int a(20);是错误的。常量表达式的值表示数组中所包含的元素的个数,即数组的长度。如int a20;表示数组a有20个元素,分别为a0、a1、a19。注意不能使用数组元素a20。常量表达式中可以包括常量和符号常量,不能包含变量。即在C语言中不允许对数组进行动态定义,数组的大小不会随着程序运行中的变化而改变。错误定义:int n;scanf(“%d”,。注意:数组必须先定义,后使用。,课件制作:刘达明 023-66834110,2、一维数组的引用,第一节 一维数组,(第四章 指针与数组),5/113,数组的具体使用对象是其中的数组元素。在一个数组定义好后,在内存中分配一组连续的存储空间。如: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语言不提供数组下标越界的保护,设计时要注意。如:int b5;只能有效引用b0、b1、b2、b3、b4。如果程序中出现b5,这时C的编译系统不会出错,但b5的值是 不确定的。,课件制作:刘达明 023-66834110,3、一维数组的初始化,第一节 一维数组,(第四章 指针与数组),7/113,数组在定义后,它所占有的存储单元中的值是不确定的,引用数组元素之前,必须保证数组的元素已经被赋以确定的值。对数组元素的初始化可以用以下方法实现:通过赋值语句或输入语句对数组中的元素赋值。在数组定义时对数组中的元素赋值。对数组元素赋值的方法是从数组的第一个元素开始依次给出初始表,表中各值之间用逗号分开。一般格式为:static=如:int a5=1,3,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,也要写出来。如: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 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=执行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,指针变量的运算:指针变量是一个变量,因此可以进行某些运算。但指针的本质是一个地址,其运算具有一些特别的性质,不能用普通变量的规则运算来作为指针运算的方式。指针变量加(减)一个整数的算术运算:只有:加、减(+、-、+、-)运算。+、+代表指针前移,-、-代表指针后移。指针变量每加(或减)1,就指向它指定的数据类型的下一个(或上一个)元素的位置。C语言规定,一个指针变量加(减)一个整数并不是简单地将指针变量的原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加(减)。如:p+i(p是指针变量,i是整数),代表的地址计算:p+c*i(c为指针变量所指向的数据类型所占内存的字节数)。运算: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=表示p不指向任何变量,而是指向地址为0的单元,表明p是空指针。也就是说,有效数据的指针不指向0单元。注意:空指针与未对p赋值是两个不同概念。空指针p是对p赋0值,而未对p赋值并不等于p无值,只是它是一个无法预料的值,这就可能影响有用单元。因此在引用指针变量之前,一定要对它赋值。任何指针变量或地址都可以与NULL作相等或不相等的比较。如:p=NULL,如果结果为真(1),表明p为空指针,否则p不是空指针。,指向基本数据类型变量的指针变量(续3),课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),14/113,数组是同一类型变量组成的有序集合,其本身存储的是各种类型的数据;而指针是专门用来存放其它变量的地址,当一个指针变量指向某一数组时,在对该数组元素的存取方式上,通过数组的下标与通过数组指针的运算访问数组元素是十分相似的。一个变量可以有一个地址相对应,而一个数组包含若干个元素。每个数组元素都在内存中占用存储单元,同样有一个地址相对应。指针变量可以指向变量,所以也可以指向数组和数组元素,即把数组起始地址或某一元素的地址放到一个指针变量中。所谓数组的指针是指数组的起始地址,而数组元素的指针是指数组元素的地址。实际上,定义的数组名就是一个指针,表示数组的首地址,是一个固定值,一个常量,与定义的指针变量是不同的。对数组的访问,即对数组元素的操作,可使用:下标法,即直接使用数组的下标方式,如:a0、a4等;和指针法,即通过指向数组元素的指针找到所需的数组元素。指向数组元素的指针 定义:int a10,*p;数组元素相当于一个变量,因此每个元素的地址都可以赋给对应类型的指针变量。如:p=则表示指针变量p指向了数组的第1个元素。这时指针变量p与数组a就建立了关系,我们可以通过指针变量p访问数组a了。注意:数组的类型与指针变量的类型应一致。,2、指向一维数组的指针,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),15/113,C语言规定数组名代表数组的首地址,即第0号元素的地址。因此:当定义int a10,*p;时,赋值语句: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计算地址,然后找出此地址单元中的值。,通过指针引用数组元素,课件制作:刘达明 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)。,例 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和第2种方法执行效率是相同的,都是将ai转换为*(a+i)处理。这两种方法找数组元素费时较多。第3种方法比第1和第2种方法执行快,用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的,它是有规律地改变地址值的。用下标法比较直观,能直接知道是第几个元素。如a5表示第5号元素(从0开始)。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪个元素。如进行多次p+操作后p值已改变,就要分析当前指针变量p指向哪个元素。但使用指针变量方式在复杂的数据结构中就显示出它的灵活性。,使用指针变量对数组操作时应注意的问题,指针变量可以实现使本身的值改变,而数组名是表示一个固定不变的数组首地址。如: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指向下一元素,如果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+);printf(“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-,结果为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。例如:想输出100个元素,可以用以下代码:,定义int a10,y,*p=a;则:,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),21/113,例4.2 用冒泡法(也称起泡法、还称交换法)对10个数排序。解:冒泡法的思想是:将相邻的两个数进行比较,将小的调到前头。,三、一维数组程序举例,排序过程:(1)比较第一个数与第二个数,若为逆序a0a1,则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置(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;printf(Input 10 numbers:n);for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(The sorted numbers:n);for(i=1;i11;i+)printf(%d,ai);,#include main()int a11,i,j,t,*p;printf(Input 10 numbers:n);p=a+1;for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(The sorted numbers:n);p=a+1;for(i=1;i11;i+,p+)printf(%d,*p);,或,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),24/113,例4.2(续3),以输入6个整数为例说明其执行过程:,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),25/113,例4.2(续4),课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),26/113,例4.2(续5),课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),27/113,例4.3 求斐波那契Fibonacci数列:1,1,2,3,5,8,的前40项。,解:在第三章中讲过(详见教材P77的例3.31),这里使用数组实现。,#include main()int i,f40=1,1;for(i=2;i40;i+)fi=fi-2+fi-1;for(i=0;i40;i+)if(i%4=0)printf(n);printf(%12d,fi);,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),28/113,例4.4 用选择法对10个数排序。,排序过程:(1)首先通过n-1次比较,从n个数中找出最小的数的下标,通过下标找到对应的元素并与第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上。(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序。(3)重复上述过程,共经过n-1趟排序后,排序结束。,课件制作:刘达明 023-66834110,29/113,例4.4(过程),例,初始:49 38 65 97 76 13 27,i=1,13,49,一趟:13 38 65 97 76 49 27,i=2,27,38,六趟:13 27 38 49 65 76 97,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),30/113,例4.4(程序),#include main()int a11,i,j,k,x;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),31/113,例4.5 用折半法查找一个数。,有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半法找出该数在数组中第几个元素的值位置。如果该数不在数组中,则打印出“无此数”。对于无序的一组数据,只能使用顺序查找法查询数据。折半查找(也称对分查找)的前提是已经排好序。折半查找法的思想:使用均分确定的方法,先测区间的中点元素;如果被查找信息的关键字小于中点元素,则关键字在测中点的前半部分(降序时为后半部分);如果被查找信息的关键字大于中点元素,则关键字在测中点的后半部分(降序时为前半部分)。继续该过程直到找到该关键字或无法二分为止。,课件制作:刘达明 023-66834110,第一节 一维数组,(第四章 指针与数组),32/113,例4.5 程序。,#include#define N 15main()int bins(int a,int n,int x);int aN,i=1,x;scanf(“%d”,/*升序的折半法查找*/int bins(int a,int n,intx)int low,high,mid;low=0;high=n-1;while(lowamid)low=mid+1;else if(xamid)high=mid-1;else return(mid);return(-1);,pos要找数位置x要查找的数low左端点high右端点mid中间点,课件制作:刘达明 023-66834110,第4章 指针与数组-习题1,33/113,C语言程序设计 龙昭华主编,习 题(一)*复习本章已讲内容,预习本章剩余内容。4.1 教材P131132的习题4.2填空题中的第小题。4.2 教材P133的习题4.4编程题中的、小题。,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),34/113,利用一维数组可以解决“一组”相关数据的处理,而对于“多组”相关数据的处理就无能为力了。如对于多个学生的成绩表格,即一个学生有多门课程,某门课程有多个学生,其描述的表格就是一个二维表格,另外矩阵的运算也是一个二维表格。在程序设计中,可以使用二维数组来进行二维表格的处理。“二维数组”是指有二个下标的数组元素所组成的数组。如果有三个下标的数组元素,称为“三维数组”。只要数组下标为二个以上的数组,我们称为“多维数组”。在一般程序设计中,主要以二维数组为主,如果要处理三维以上的数组,可以使用二维数组的方式进行推广。,课件制作:刘达明 023-66834110,一、二维数组的定义和引用,第二节 二维数组,(第四章 指针与数组),35/113,1、二维数组的概念 如平面上的一组点的集合就可用二维数组来表示,每个点由代表着x轴的横坐标和代表着y纵坐标来表示。用二维数组表示:如果5个点代表5个温度采集点的话,则:P11=28.1 P12=29.5 P35=33.8 P43=31.2 P64=32.4分别代表着这5个点的温度。,课件制作:刘达明 023-66834110,2、二维数组的定义,第二节 二维数组,(第四章 指针与数组),36/113,二维数组的定义方式为:类型说明符 数组名常量表达式1 常量表达式2;说明:类型说明符表示数组元素具有的数据类型。可以是int、short、long、char、unsigned、float、double等。常量表达式1表示行数,常量表达式2表示列数,常量表达式1常量表达式2表示数组中所包含的元素的个数。二维数组的下标是2对方括号,如a102的形式。不能写成a10,2、a(10,2)等形式。相同数据类型的数组可在同一类型说明符下说明。如:flaot a103,b35;例如:存放30个学生的数学、物理、英语成绩,用二维数组进行定义:int grade303;其数组名为grade,表示有30行,3列,共90个元素,可存放30个学生的三门课程的成绩。,课件制作:刘达明 023-66834110,3、二维数组的存储方式,第二节 二维数组,(第四章 指针与数组),37/113,在C语言中每个数组的元素都占有连续的存储空间,一维数组的元素是按照下标在一行上递增的顺序连续存放的。而二维数组的存储是按行进行的,即先按顺序存放第一行的元素,然后是第二行的元素,第三行的元素,直到全部元素存储完。其下标也是递增的顺序增长。对于连续的存储空间,可以用相应的序号来表示多维数组元素的存储位置,实际上多维数组在计算机中是按一维数组存放的。,当数组有n列时,计算aij的序号公式为:i*n+j。如:int a34;表示:每一维的下标从0开始,整个 数组元素为:34=12个。其存储方式见右图:a21的序号为:2*4+1=9。,课件制作:刘达明 023-66834110,4、二维数组的引用,第二节 二维数组,(第四章 指针与数组),38/113,二维数组元素的引用格式为:数组名下标表达式1下标表达式2;其中:下标表达式1、下标表达式2可以是整型常量或整型表达式,如:a32、bij、ci+2j*2等形式都是被允许使用的。它与二维数组定义时的下标是不同的。其实二维数组和一维数组的引用方式,使用规则都是相似的。与一维数组一样,二维数组的下标也是从0开始算起。因此,对一个二维数组amn来说,它的数组元素的行下标最大值为m-1,列元素下标最大值为n-1。注意严格区别:int a34;和a34=3;。前者a34是定义数组,数组大小为3行4列,而后者a34代表数组的某一个元素。二维数组可以做相应的运算。如:赋值运算:a21=3;取地址运算:a111,课件制作:刘达明 023-66834110,二维数组可看成若干元素的一维数组,第二节 二维数组,(第四章 指针与数组),39/113,在C语言中,二维数组采用类似于float a34;的定义,使我们可以把二维数组看成是一种特殊的一维数组:它的元素又是一个一维数组。如:float a34;把a看成是一维数组,它有3个元素:a0、a1、a2,每个元素又包括4个元素的一维数组。而a0、a1、a2就看成是包含4个元素的一维数组的数组名。即定义:float a34;相当于定义:float a04,a14,a24;。,课件制作:刘达明 023-66834110,5、二维数组的初始化,第二节 二维数组,(第四章 指针与数组),40/113,二维数组与一维数组一样,可以对二维数组的元素进行赋值或者初始化。数组在定义后,它所占有的存储单元中的值是不确定的,引用数组元素之前,必须保证数组的元素已经被赋以确定的值。二维数组初始化的方法如下:分行给二维数组赋初值。int a23=1,2,3,5,6,7;第一个内花括号的值赋给数组的第一行,第二个内花括号的值赋给数组的第二行。所有数据写在一个花括弧内,按顺序赋初值。int a23=2,3,5,6,7,8;它将第一组3个数赋给数组的第一行,第二组3个数赋给数组的第二行。该方法相对简单,但是,当数组元素较多时,容易出现混乱、遗漏、出错。在行、列数较多时,使用第一种方法较好。对于定义的静态存储(关键字为static)数组,如果没有赋初值,则系统自动将全部元素赋以0值或0值。如:static int a22;相当于static int a22=0,0,0,0 而对定义的int a22;如果不对其赋初值,则数组中各元素的值是不确定的。,课件制作:刘达明 023-66834110,对部分元素赋初值,第二节 二维数组,(第四章 指针与数组),41/113,数组在对部分元素赋初值时,如果后面的数组元素不赋初值,系统会对所有数组元素自动赋以0值。如:int a23=0,2,1;相当于:int a23=0,2,0,1,0,0;。再如:static int d23=8,5,9;相当于:static int d23=8,5,0,9,0,0;。又如:int b23=1,0,3;相当于:int b23=1,0,3,0,0,0;。如果对全部元素都赋初值时,则定义数组时,第一维(行)的长度可以不指定,但第二维(列)的长度不能省需要指定。如:int a4=1,2,3,4,5,6,7,8,9,10,11,12等价于:int a34=1,2,3,4,5,6,7,8,9,10,11,12;。,课件制作:刘达明 023-66834110,键盘输入赋值,第二节 二维数组,(第四章 指针与数组),42/113,通过键盘输入二维数组的数组元素,一般需要使用二重循环的形式进行。可以先行输入,也可先列输入。先行输入方式 int a34;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,说明:不管是先行输入,还是先列输入,在计算机存储中数组元素仍然是按行存储的。,课件制作:刘达明 023-66834110,通过赋值语句赋初值,第二节 二维数组,(第四章 指针与数组),43/113,如:int a22;a00=1;a01=2;a10=3;a11=4;。在定义数组时也可以只对部分元素赋值,而省略第一维的长度,但应使用分行赋值方式。如:int a4=1,3,1,0,0,9;它与 int a34=1,3,1,0,0,9;等价。注:错误的初始化定义:int a33;a=1,2,3,4,5,6,7,8,9;这是错误的。而int a33;a33=1,2,3,4,5,6,7,8,9;也是错误的赋值方式。,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),44/113,C语言允许多维数组。多维数组的定义形式为:类型说明符 数组名常量表达式1 常量表达式2常量表达式n;例如:定义三维数组的方法为:int a234;定义四维数组的方法为:float f23410;等。多维数组元素在内存中的存放顺序仍然是“按行优先”,其排列顺序为:第一维的下标变化最慢,最右边的下标变化最快。如:int a234;定义的是一个三维数组,共有2*3*4=24个元素。其中第一维下标变化最慢,第二维下标变化次之,第三维下标变化最快。在内存的存放顺序为:a000,a001,a002,a003,a010,a011,a012,a013,a020,a021,a022,a023,a100,a101,a102,a103,a110,a111,a112,a113,a120,a121,a122,a123。,二、多维数组的概念,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),45/113,分行初始化:int a234=1,2,3,4,5,6,7,8,0,0,0,0,13,14,15,16,17,18,19,20,21,22,23,24。顺序赋值初始化:int a234=1,2,3,4,5,6,7,8,0,0,0,0,13,14,15,16,17,18,19,20,21,22,23,24;。也可省略第一维的长度初始化:int 34=1,2,3,4,5,6,7,8,0,0,0,0,13,14,15,16,17,18,19,20,21,22,23,24;。可将它看成2个二维数组a034和a134。也可看成是6个特殊的一维数组:a004、a014、a024、a104、a114、a124。,多维数组的初始化,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),46/113,1、二维数组的地址 关于一维数组与指针关系的结论可以推广到二维数组、三维数组等多维数组。可以把二维数组看成是这样的一维数组:它的每个单元本身又是一个一维数组。例如:int a43=1,3,5,7,9,11,13,15,17,19,21,23;这里a是一个数组名。数组a包含4个元素(即4行):a0,a1,a2,a3,而每个元素又是一个包含3个元素(即3列元素)的一维数组。如a1代表的一维数组包括:a10,a11,a12三个元素。,三、指向二维数组的指针变量,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),47/113,从二维数组的角度来看,a代表整个二维数组的首地址,也就是二维数组a的第0行的首地址。假设二维数组a的首地址为:1000,那么,a的地址应为1000。则a+1为1006,因为第0行有3个整型数据,因此a+1的含义是a1的地址。a+2代表第2行的首地址,它的值是1012,是a2的地址。a+3代表第3行的首地址,它的值是1018,是a3的地址。既然把a0、a1、a2、a3看成是4个一维数组名,而C语言又规定了数组名代表数组的首地址。因此a0代表了第0行一维数组中第0列元素的地址,即&a00。同样a1代表了第1行一维数组中第0列元素的地址,即&a10。a2代表了第2行一维数组中第0列元素的地址,即&a20。a3的值是&a30。作为一维数组a0的其他元素的地址可以使用a0+0、a0+1、a0+2分别表示元素a00、a01、a02的地址。一般地,ai+j即表示第i行第j列元素的地址,即&aij。如a1的值是1006,则a1+1表示1008,它是&a11的值。,有关二维数组地址的描述:,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),48/113,由于a+1表示a1的地址,因此*(a+1)就是a1的值。a表示a0的地址,因此*a也就是a0的值。一般地,a+i表示ai的地址,因此*(a+i)就是ai的值。所以*a与a0是等价的,a1与*(a+1)是等价的。一般地,ai与*(a+i)是等价的。而a0又表示a00的地址,a1又表示a10的地址,ai又表示ai0的地址,因此*(a+1)、*a、*(a+i)虽然形式上是指针运算符,似乎指的是变量地址中所存储的值,但它仍然是地址,它们分别是a1、a0、ai的值。而a1、a0、ai仍然是地址,它们分别是a10、a00、ai0的地址。注意:a+i并不是一个变量,它是ai的地址。a是二维数组名,代表数组首地址,不能用*a来得到a00的值。*a相当于*(a+0)即表示a0,它是第0行地址。a是行指针,*a是列指针。*a表示a00的值。同样*(a+1)是a10的值。,有关二维数组地址的描述(续1):,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针与数组),49/113,二维数组元素的值的表示 既然a1与*(a+1)是等价的,那么a1+2就可以写成*(a+1)+2,而a1+2是a12的地址。因此*(a1+2)就是a12的值,所以*(*(a+1)+2)也代表a12的值。(注意值与地址的表示与差别)。即a12、*(a1+2)、*(*(a+1)+2)三个是等价的,都表示数组元素a12的值。同样a01、*(a0+1)、*(*a+1)三个是等价的,都表示数组元素a01的值。一般地,aij、*(ai+j)、*(*(a+i)+j)都表示aij的值,甚至还可以写成(*(a+i)j的形式。,有关二维数组地址的描述(续2):,课件制作:刘达明 023-66834110,第二节 二维数组,(第四章 指针

    注意事项

    本文(《指针与数组》PPT课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开