3.3-3.5二维数组(1).ppt_第1页
3.3-3.5二维数组(1).ppt_第2页
3.3-3.5二维数组(1).ppt_第3页
3.3-3.5二维数组(1).ppt_第4页
3.3-3.5二维数组(1).ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、3.3 二维数组及指针 3.3.1 二维数组的定义和初始化 1二维数组的定义 二维数组定义的一般形式为: 类型标识符 数组名常量表达式1 常量表达式2,行数,列数,元素个数=行数*列数,如:int a34; 定义了一个3 行4列的存放整型数据的二维数组为a,共有12个元素,分别为: a00,a01,a02,a03,a10,a11,a12, a13,a20,a21,a22,a23。 数组中的元素在使用时与同类型的指针变量相同。,元素类型,代表整个二维数组的首地址的地址常量。,二维数组的存储: 二维数组:按行序优先(原因:内存是一维的) 多维数组:最右下标变化最快 如果定义int a34;二维数组

2、a的存储顺序如右下图。,二维数组a的逻辑结构,二维数组a的存储结构示意图,代表整个二维数组的首地址的地址常量。,2二维数组的初始化 全部元素初始化 行数可以省略,列数不能省略。可以按元素排列顺序(行优先)整体初始化也可以用花括号分行赋初值。 如:有一个二维矩阵如下,请为其定义一个二维数组:,分行初始化,int a34=1,2,3,4,5,6,7,8,9,10,11,12;,int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,下列初始化是等价的:,int a34= 1,2,3,4,5,6,7,8,9,10

3、,11,12;,按元素排列顺序初始化, 部分元素初始化 没初始化的元素,数值型数组时值为0,字符型数组时值为0。 此时,可以按元素排列顺序(行优先)初始化也可以用花括号分行赋初值,通过的个数来确定行数。,如:有一个二维矩阵如下,请为其定义一个二维数组:,按元素排列顺序初始化,分行初始化,省略行数时,下列初始化是等价的:,int a34=1,2,0,0,0,5;,int a34=1,2,0,0,0,5; 或 int a34=1,2,0,5;,int a 4=1,2,0,0,0,5,0,0,0; int a 4=1,2,0,5,0;,3.3.2 二维数组元素的引用方法 (一)下标法最直接的方法 方

4、法一:下标法 数组名行标 列标 下标的范围, 0行标行数1,0列标列数1 。,【例15】已知矩阵 2 -8 20 0 9 5 -38 -34 10 32 4 -3 求矩阵的最小值及其所在的位置。,main() int a34=2,-8,20,0, 9,5,-38,-34, 10,32,4,-3; int i,j,row,col,min; printf(min=%d,row=%d,col=%d,min,row+1,col+1); ,运行结果: min=-38,row=2,col=3,min=a00; row=0; col=0; for(i=0;iaij) min=aij; row=i; col=

5、j; ,首先加深对二维数组的理解,(二)指针法 : 找到每个元素aij的地址,例 int a34;,二维数组a是由3个元素组成的一维数组,每个元素ai由包含4个元素 的一维数组组成,二维数组a的存储结构示意图,二维数组a的逻辑图,(2)将每一行看成是一个元素,表示成 数组名行标。 二维数组aMN可以看成是一个一维数组,由M(行数)个元素组成。 例如int a34, 数组a是由a0,a1和a2三个元素组成的一维数组的数组名。因此:a是a0的地址(简称a指向a0)。,对二维数组aMN的理解(难点) 例如int a34,数组a的逻辑结构和存储结构示意图,数组名a是代表整个二维数组的首地址的地址常量。

6、,(3)行向量ai (i是行标,0iM-1)是一个一维数组,包含N(列数)个元素。,(1),数组名a又是指向a0的地址常量。a ,(1)理解:二维数组名a+i的含义(需要把它视作一维数组),因为:前面学过,对于一维数组a,ai表示向后跳过i个元素,即指向一维数组中的下标为i的元素。,这里,a是由a0,a1和a2三个元素组成的一维数组,二维数组名ai是ai的地址,即向后跳过i行元素 a+i 等价于 printf(%4d, *(a1+2); printf(%4dn, *(a0+2*4+1); ,运行结果,13 19,【例3.16】计算44阶矩阵的周边元素值之和。 main() int a44,i,

7、j,sum; sum=0; /*读入数据到数组a*/ /*计算周边元素值之和*/ printf(sum=%dn,sum); ,运行结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sum=102,for(i=0;i4;i+) for(j=0;j4;j+) scanf(%d, ,for(i=0;i4;i+) for(j=0;j4;j+) if(i=0|i=3|j=0|j=3) sum+= aij ;,ai+j,*(ai+j) ;,方法一:下标法 方法二:一维数组名法 方法三: 二维数组名法,*(*(a+i)+j);,*(a+i)+j,请问p 是aij的地址。,

8、2指向数组元素的指针变量 定义与指向变量的指针变量的定义相同。如: int a34 , *p; p= 则把元素a00的地址赋给指针变量p,也就是说,指针变量p指向数组元素a00。,p+i表示:后移i个数组元素位置。(物理后移) (只与p的类型有关系,此时p指向的是数组元素),iNj 此时N是3, int *p;/*动态的更新指针p使它依次指向每个元素*/ for(_) if(p-a0)%4=0) printf(n); printf(%4d,_); ,运行结果: 1 3 5 7 9 11 13 15 17 19 21 23,p= p+,*p,方法四:利用指向二维数组元素的指针变量引用数组元素,不

9、能写成a+12 a+12表示p a0+12 ; p+,3指向由m个元素组成的一维数组的指针变量 定义的一般形式为: 类型标识符 (*指针变量名)常量表达式 如: int (*p)4; 其含义为:p是一个指针变量,它指向包含4个整型元素的一维数组。,例如:int a34,(*p)4=a; /*或 /*或 p=,因此,p+i等价于 int row,col,(*p)4; p=a; scanf(row=%d,col=%d, 运行结果: row=2,col=1,*(*(p+row)+col),a21=10,int a34,(*p)4=a; 可得出如下几个等价关系 ai的地址: 则下面对元素aij的引用不

10、正确的是( )。 A、 *(*(a+i)+j) B、 *(ai+j) C、 *(*(p+i)+j) D、 *(*(q+i)+j),D,D、q是指向元素a00的指针,q+1表示后移一个元素的位置,所以D应该改成*(q+i*4+j),3.4 指针数组,元素为指针类型的数组,即数组中的每个元素都是指针变量。 指针数组的定义形式为: 类型 *数组名常量表达式,如:int *p4;/* 数组p中的元素类型是int* */ 定义了一个指针数组,数组名为p,它有4个元素,每个元素都是指向整型变量的指针变量。,注意区别: int (*p)4; int *p4;,/*p是指向一个容纳4个整型元素的一维数组的指针

11、变量*/,/*p是一个容纳4个整型指针的一维数组*/,类型 *是数组中的元素类型,main() int a34=1,2,3,4,5,6,7,8,9,10,11,12; ,【例3.19】借助指针数组,按行输出二维数组中的元素值。,运行结果: 1 2 3 4 5 6 7 8 9 10 11 12,和普通数组一样,指针数组在内存中分配连续的存储空间,指针数组也可以初始化。指针数组元素在使用时与同类型的指针变量相同。,int i,j; for(i=0;i3;i+) for(j=0;j4;j+) printf(%4d,*(pi+j); printf(n); ,int *p3=a0,a1,a2;,字符串序

12、列的存储与操作 例如:有一组字符串序列 “China”、“Japan”、“USA”、“Russia”、“Canda” ,如何存储字符串序列? 方法一:二维字符型数组,char str 20= China,Japan,USA,Russia,Canda ;,C h i n a 0 0 0,U S A 0 0 0 0 0,C a n d a 0 0 0,J a p a n 0 0 0,R u s s i a 0 0,str,方法二:字符指针数组,char *name= China,Japan,USA,Russia,Canda ;,name是一个容纳5个字符指针变量的指针数组,其逻辑图如下。,name,编写程序输出上述字符串中最短的那个字符串。,#include string.h main() char *name=China,Japan,USA,Russia, Canda; int pos=0,i; ,for(i=1;istrlen(namei) pos=i; puts(namepos);,3.5 二级指针变量,其定义的一般形式为: 类型 * *变量名;,C语言允许定义指向指针的指针变量,即该指针变量存放的是另一个指针变量的地址,称其为二级指针变量。 因此前面讲过的存放普通变量的地址的指

温馨提示

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

评论

0/150

提交评论