版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.二维数组的定义二维数组定义的一般形式如:inta[3][4];定义了一个整型二维数组,数组名为a,行数为3,列数为4,
共有12个元素,分别为:a[0][0],a[0][1],a[0][2],a[0][3]a[1][0],a[1][1],a[1][2],a[1][3]a[2][0],a[2][1],a[2][2],a[2][3]类型标识符数组名[常量表达式1][常量表达式2]一、二维数组的定义和初始化行数列数二维数组的存储
C语言中,二维数组按行存储,即按行序依次为数组分配连续的内存单元。
如:inta[3][4];逻辑结构存储结构a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a数组名代表数组的起始地址二维数组的处理方法如:inta[3][4];C语言对二维数组的处理方法是将其分解成多个一维数组a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]aa[0]a[1]a[2]系统并不为数组名分配内存,由a[0],a[1],a[2]组成的一维数组在内存不存在,只是表示相应行的首地址。2.二维数组的初始化①全部元素初始化inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};如:有一个矩阵如下,定义一个二维数组并初始化思考题:省略行数时,系统如何确定行数?可用花括号分行赋初值,也可按元素排列顺序整体初始化;行数可以省略,但列数不能省略。②部分元素初始化如:有一个矩阵如下,定义一个二维数组并初始化。inta[3][4]={1,2,0,0,0,5};inta[3][4]={{1,2},{0,5},{0}};inta[][4]={1,2,0,0,0,5,0,0,0};inta[][4]={{1,2},{0,5},{0}};inta[3][4]={{1,2},{0,5}};依次赋值给前面的元素,未初始化的元素,数值型数组值为0,字符型数组值为'\0';可用花括号分行赋初值,也可以按元素排列顺序初始化;用花括号分行赋初值,或初值个数与列数的商上取整后等于行数时,行数可以省略。
③二维字符型数组初始化如:charstr[3][6]={"China","USA","Japan"};
相当于定义了3个一维数组str[0]、str[1]和str[2],并分别初始化,数组str各元素的值为:str[0]China\0str[1]USA\0\0\0str[2]Japan\0二维数组元素的下标表示形式数组名[表达式1][表达式2]其中,表达式1和表达式2的类型任意,表达式1的值是行标,表达式2的值是列标。二、二维数组元素的下标法引用①0≤表达式1的值≤行数-10≤表达式2的值≤列数-1②数组元素的使用与同类型的变量相同【例】若有定义:inta[3][4]={{2,-8,20,0},{9,5,-38,-34},{10,32,4,-3}}inti=1,j=0;则下列对数组元素引用正确的是()。①a[2][1]②a[3][3]③a[1+1][2+1]④a['b'-'a'][8-6]⑤a[1][-2]⑥a[i,j]⑦a[i][j]⑧a[i-1][j+1]+=10⑨a[++i][--j]⑩a(1)(2)①③④⑦⑧#include"stdio.h"voidmain(){inta[3][4]={{2,-8,20,0},{9,5,-38,-34},{10,32,4,-3}};inti,j,min,row,col;min=a[0][0];row=0;col=0;for(i=0;i<3;i++)for(j=0;j<4;j++)if(min>a[i][j]){min=a[i][j];row=i;col=j;}printf("min=%d,row=%d,col=%d",min,row,col);}程序1☞【例】求3×4矩阵的最小值及其所在的位置(行标和列标)/*初始化min、row和col*//*min与数组元素依次比较,若min小,则更新min、row和col*//*输出*/C语言对二维数组的处理方法是将其分解成多个一维数组
三、二维数组元素的指针法引用如:inta[3][4];把a看作由元素a[0],a[1],a[2]组成的一维数组。把二维数组的每一行看作一个一维数组,数组名为a[i](0≤i≤2),元素为a[i][0],a[i][1],a[i]2],a[i][3]。a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]aa[0]a[1]a[2]如:inta[3][4];①二维数组的数组名代表整个二维数组的首地址,数组名加1是加一行元素所占的字节数。②一维数组的数组名代表整个一维数组的首地址,数组名加1是加一个元素所占的字节数。a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]存储结构aa+1a+2a[0]a[1]a[2]a[0]+1a[1]+2a[0]+6a[2]+3a[1]+7a[0]+11③二维数组元素地址为:&数组名[行标][列标]思考题若有定义:inta[3][4];则:a、a[0]和&a[0][0]的含义及关系如何?③a[i][j]
,*(a[i]+j),*(*(a+i)+j)等价若有定义:inta[3][4];一维数组名法二维数组名法下标法1.利用一维数组数组名引用二维数组元素引用的一般形式*(一维数组名+表达式)其中,表达式的类型任意,其值为二维数组元素的列标等价关系①&a[j]与a+j等价;a[j]与*(a+j)等价②
&a[i][j],a[i]+j,*(a+i)+j等价运行结果
3131323232319程序2☞【例】写出下列程序的运行结果#include"stdio.h"voidmain(){printf("%4d\n",*(a[0]+1));printf("%4d%4d\n",*(a[1]+2),*(a[0]+6));printf("%4d%4d%4d\n",*(a[2]+3),*(a[1]+7),*(a[0]+11));printf("%4d\n",*(a[0]+2*4+1));}a[0][0]1a[0][1]3a[0][2]5a[0][3]7a[1][0]9a[1][1]11a[1][2]13a[1][3]15a[2][0]17a[2][1]19a[2][2]21a[2][3]23aa[0]a[1]a[2]a[0]+1a[1]+2a[0]+6a[2]+3a[1]+7a[0]+11a[0]+9inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};是否可以把二维数组a看成是数组名为a[0]的一维数组?若可以,二维数组元素a[i][j]又如何表示?
思考题#include"stdio.h"voidmain(){inta[4][4],i,j,sum=0;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf("%d",
);for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==0||i==3||j==0||j==3)sum+=;printf("sum=%d\n",sum);}a[i]+j*(a[i]+j)一维数组名法*(*(a+i)+j)*(a+i)+j程序3☞【例】计算4×4阶矩阵的周边元素值之和。2.利用二维数组名引用数组元素引用的一般形式*(*(数组名+表达式1)+表达式2)其中,表达式1的值是行标,表达式2的值是列标。二维数组名法&a[i][j]a[i][j]/*读入数据到数组a*//*计算周边元素值之和*//*输出周边元素和*/如:inta[3][4],*p,*q;p=&a[0][0];/*或p=a[0];*/
q=a[1]+2(q指向a[1][2])3.利用指向二维数组元素的指针变量引用数组元素定义与指向变量的指针变量的定义相同
p引用二维数组元素的一般形式
*(指针变量+表达式)指针变量[表达式]若指向数组的第一个元素,则:
行标=(表达式)/列数列标=(表达式)%列数若不指向数组的第一个元素,则:
行标=(指针变量-数组名[0]+表达式)/列数列标=(指针变量-数组名[0]+表达式)%列数
a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]a[1]a[2]qp+9q+4#include"stdio.h"voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int*p;for(p=a[0];p<=a[0]+11;p++){
}} 程序4☞【例】按行输出二维数组的元素值。输出结果13917a[0][0]1a[0][1]3a[0][2]5a[0][3]7a[1][0]9a[1][1]11a[1][2]13a[1][3]15a[2][0]17a[2][1]19a[2][2]21a[2][3]23pif((p-a[0])%4==0)/*每行输出4个元素*/printf("\n");printf("%4d",*p);57若有定义:inta[3][4],*p=a[0];,如何用p引用二维数组元素a[i][j]?
思考题111315192123指向一维数组指针变量定义的一般形式
类型标识符(*指针变量名)[常量表达式]如:inta[3][4],
(*p)[4]=a;如:int(*p)[4];含义:p是指针变量,可指向包含4个整型元素的一维数组4.
利用指向一维数组的指针变量引用二维数组元素pa[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]aa+1a+2可指向二维数组中的某一行,加(减)1是加(减)一行元素所占的字节数;可以引用二维数组元素。p+1p+2a[i][j],*(a[i]+j),*(*(a+i)+j)p[i][j],*(p[i]+j),*(*(p+i)+j)用指向一维数组的指针变量引用数组元素数组元素引用数组元素引用引用二维数组元素的的一般形式*(*(指针变量+表达式1)+表达式2)其中:列标=表达式2若指针变量指向第一行,行标=表达式1
否则,行标=指针变量-二维数组名+表达式1
思考题若有定义:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},
(*p)[4]=a+1;
①*(*(p+1)+2)=?②p[1][1]=?#include"stdio.h"voidmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};introw,col,(*p)[4];p=a;scanf("row=%d,col=%d",&row,&col);printf("a[%d][%d]=%d\n",row,col,
);}p[row][col]*(p[row]+col)程序5☞运行结果row=2,col=1↙a[2][1]=10【例】输出3×4阶矩阵的任意一个元素的值。*(*(p+row)+col)指针数组元素为指针类型的数组,即数组中的每个元素都是指针变量。1.指针数组如:int*p[4];含义:定义了一个指针数组,数组名为p,它有4个元素,每个元素都是指向整型变量的指针变量。下列三种定义的含义是什么?①intp[4];②int(*p)[4];
③int*p[4];2.指针数组定义的形式
类型标识符*数组名[常量表达式]思考题①指针数组在内存中分配连续的存储空间程序6☞②指针数组可以初始化③指针数组元素在使用时与同类型的指针变量相同说明#include"stdio.h"voidmain(){inta[5]={1,2,3,4,5},i;int*p[5];for(i=0;i<5;i++)p[i]=&a[i];for(i=0;i<5;i++)printf("%4d",a[i]);}【例】利用指针数组输出一维数组元素值。p[0]p[1]p[2]p[3]p[4]1a[0]2a[1]3a[2]4a[3]5a[4]printf("%4d",*p[i]);#include"stdio.h"#include"string.h"voidmain(){char*name[]={"China","Japan","USA","Russia","Canada"};intpos=0,i;/*pos存储最短字符串下标,初始假定第一个字符串*/for(i=1;i<5;i++)if(strlen(name[pos])>strlen(name[i]))pos=i;puts(name[pos]);}【例】输出5个字符串中最短的字符串。程序7☞name[0]China\0
name[1]Japan\0
name[2]USA\0
name[3]Russia\0name[4]Canada\0#defineN5#include"stdio.h"#include"string.h"voidmain(){char*name[]={"China","Japan","USA","Russia","Canada"};char*temp;inti,j;for(i=0;i<N-1;i++)/*选择排序*/for(j=i+1;j<N;j++)if(strcmp(name[i],name[j])>0){temp=name[i];name[i]=name[j];name[j]=temp;}for(i=0;i<N;i++)puts(name[i]);}【例】将5个字符串按由小到大的顺序输出。程序8☞name[0]China\0
name[1]Japan\0
name[2]USA\0
name[3]Russia\0name[4]Canada\0name[0]China\0
name[1]Japan\0
name[2]USA\0
name[3]Russia\0name[4]Canada\0排序前指针数组name的内容排序后指针数组name的内容思考题:如何用二维数组实现?二者的区别是什么?二级指针如:inta[3][4];a[2][3]a[2][2]a[2][1]a[2][0]a[1][3]a[1][2]a[1][1]a[1][0]a[0][3]a[0][2]a[0][1]a[0][0]aa[0]a[1]a[2]1.二级指针常量如:char*name[]={"China","Japan","USA","Russia","Canada"};\0adanaCname[4]\0aissuRname[3]
\0ASUname[2]
\0napaJname[1]
\0anihCname[0]name二级指针常量一级指针常量二级指针常量一级指针变量二级指针变量定义的一般形式
类型标识符**变量名如:int**p;含义:p是指向整型指针变量的指针变量,即指针变量p存储的内容是另一个整型指针变量的地址。2.二级指针变量【例】写出下列程序的运行结果。#include"stdio.h"voidmain(){int*p=&a;int**pp=&p;printf("a=%d,*p=%d,**pp=%d",a,*p,**pp);}3appp整型变量一级指针变量二级指针变量运行结果a=3,*p=3,**pp=3inta=3;程序9☞#defineN5#include"stdio.h"#include"string.h"voidmain(){char*name[]={"China","Japan","USA","Russia","Canada"};char*temp;char**i,**j;for(i=name;i<name+N-1;i++)for(j=i+1;j<name+N;j++)if(strcmp(*i,*j)>0){temp=*i;*i=*j;*j=temp;}for(i=name;i<name+N;i++)puts(*i);}【例】将5个字符串按由小到大的顺序输出。要求:用二级指针变量实现程序10☞name[0]China\0
name[1]Japan\0
name[2]USA\0
name[3]Russia\0name[4]Canada\0name3.以下程序执行后的输出结果是()。#include"stdio.h"#include"string.h"voidmain(){char*p[10]={"abc","aabdfg","dcdbe","abbd","cd"};
printf("%d\n",strlen(p[4]));}①5②4③3④24.有定义语句:int(*prt)[3];,则标识符prt()。①是一个指向整型变量的指针②是一个指针数组名,每个元素都是一个指向整数变量的指针③是一个指针,它指向一个具有三个元素的一维数组④定义不合法一、单项选择题1.若有定义:inta[3][4];,则输入其3行2列元素的正确语句为()。①scanf("%d",a[3,2]);②scanf("%d",*(*(a+2)+1))③scanf("%d",*(a+2)+1);④scanf("%d",*(a[2]+1));2.设有定义:intt[3][2];,则能正确表示t数组元素地址的是()。①&t[3][2]②t[3]③t[1]④*t[2]③③④③练习题1.程序的功能是检查一个N×N矩阵是否对称。#defineN4
#include"stdio.h"voidmain(){inta[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4};inti,j,found=0;for(i=0;i<N;i++)for(j=0;
;j++)
if(a[i][j]!=a[j][i]){
;break;}if(found)printf("No");elseprintf("Yes");}
j<ifound
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中国电信湖北荆州分公司校园招聘17人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电信吉林辽源分公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国建筑股份限公司岗位招聘2人(投资部)易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国交建轨道交通事业部招聘14人易考易错模拟试题(共500题)试卷后附参考答案
- 2024“才聚齐鲁成就未来”山东省金融资产管理股份限公司社会招聘7人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度大数据中心建设及运营合同2篇
- 2024年度智能家居系统云平台建设合同
- 2024年度离婚后公司股份转让合同
- 威灵电机常州基地项目车间二安全专项组织施工方案1
- FAB销售法则课件
- 齐鲁书社新二年级上册传统文化全
- 腕关节损伤PPT课件
- 围棋教案13教学设计
- 设计艺术鉴赏(课堂PPT)
- 物流园区土石方施工方案
- 称念诸佛名号功德(3)
- 专用车六性分析报告
- 新零售小米之家营销策略
- LCD数字显示体温计设计
- 辊压机施工方案
- (最新整理)急救药品使用登记表
评论
0/150
提交评论