语言二维数组与指针.pptx
第一节 二维数组的定义定义形式:数据类型数组名常量表达式1常量表达式2数组元素的存放顺序内存是一维的按行序优先如:int a32;int a32a01a10a11a20a21a00a00 a01a10 a11a20 a21第2页/共30页第1页/共30页例 int a34;二维数组的理解:特殊的一维数组a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a0a1a2每个元素ai各包含4个元素分别为:ai0,ai1,ai2,ai3,二维数组a由3个元素组成:a0、a1、a2a01a02a03a10a11a00a13a20a21a22a23a12a0a1a2第3页/共30页第2页/共30页 例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化分行全部初始化 第二节第二节 二维数组的初始化及引用二维数组的初始化及引用第4页/共30页第3页/共30页 例 int a23=1,2,4;a00 a01 a02 a10 a11 a12120400部分初始化第二节第二节 二维数组的初始化及引用二维数组的初始化及引用分行部分初始化 第5页/共30页第4页/共30页 例 int a3=1,4,5;a00 a01 a02 a10 a11 a12100450第一维长度省略初始化分行初始化,省略第一维的大小第二节第二节 二维数组的初始化及引用二维数组的初始化及引用第6页/共30页第5页/共30页按元素排列顺序初始化 例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化第二节第二节 二维数组的初始化及引用二维数组的初始化及引用第7页/共30页第6页/共30页 例 int a23=1,2,4;a00 a01 a02 a10 a11 a12124000部分初始化按元素排列顺序部分初始化 第二节第二节 二维数组的初始化及引用二维数组的初始化及引用第8页/共30页第7页/共30页 例 int a3=1,2,3,4,5;a00 a01 a02 a10 a11 a12123450第一维长度省略初始化按元素排列顺序初始化,省略第一维大小 第二节第二节 二维数组的初始化及引用二维数组的初始化及引用第9页/共30页第8页/共30页引用形式引用形式 数组名下标下标 第二节第二节 二维数组的初始化及引用二维数组的初始化及引用如:int a23;可以引用的数组元素有:a00,a01,a02,a10,a11,a12;第10页/共30页第9页/共30页二维数组的地址对于一维数组:(1)数组名array表示数组的首地址,即array0的地址;(2)数组名array是地址常量(3)array+i是元素arrayi的地址(4)arrayi *(array+i)arrayint array10;第三节第三节 二维数组和指针二维数组和指针第11页/共30页第10页/共30页对于二维数组:(1)a是数组名。包含三个元素 :a0,a1,a2(2)每个元素ai又是一个一维数组,包含4个元素:ai0、ai1、ai2、ai3aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020102020200020042010201420202024a00a01a10a11a20a21a02a03a12a13a22a23a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+1二维数组的地址第12页/共30页第11页/共30页对二维数组 int a34,int a34,有a-a-二维数组的首地址,即第0 0行的首地址a+i-a+i-第i i行的首地址ai ai *(a+i)*(a+i)-第i i行第0 0列元素的地址ai+j ai+j *(a+i)+j*(a+i)+j-第i i行第j j列元素的地址*(ai+j)(ai+j)*(*(a+i)+j)*(*(a+i)+j)aij aija+i&ai,表示第表示第i行首地址,指向行行首地址,指向行ai *(a+i)&ai0,表示第表示第i行第行第0列元列元素地址,指向列素地址,指向列a0a1a2200020102020200020042010201420202024a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2二维数组的地址第13页/共30页第12页/共30页二维数组元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+1*4+2)首元素地址表示:(1)a+1 (2)&a10(3)a1(4)*(a+1)行指针列指针int a34;a00a01a10a11a20a21a02a03a12a13a22a23元素地址表示:(1)&a12(2)a1+2(3)*(a+1)+2(4)&a00+1*4+2二维数组的地址第14页/共30页第13页/共30页表示形式含义地址a二维数组名,数组首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值200020002010201020142312 4 615 7 9 8 23 3 2 5 17二维数组的地址第15页/共30页第14页/共30页指向二维数组元素的指针变量例例 指向二维数组元素的指针变量指向二维数组元素的指针变量main()static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(n);printf(%4d ,*p);int a34;a00a01a10a11a20a21a02a03a12a13a22a23pp=*a;p=&a00;p=*a0;p=a;第16页/共30页第15页/共30页通过指针数组来引用二维数组元素若有以下定义:int *p3,a34,i,j;表示p是一个数组名,该数组类型为指针类型,即数组的3个元素均为指针类型的数据。注意:int*p4与int(*p)4代表不同的含义。第17页/共30页第16页/共30页指针数组用法举例main()static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int i,j,*p3;for(i=0;i3;i+)pi=ai;for(j=0;j4;j+)printf(%d,*(pi+j);printf(n);int a34;a00a01a10a11a20a21a02a03a12a13a22a23 pijp0=*a;p0=&a00;p0=a0;p0 p1 p2 *(ai+j)aij第18页/共30页第17页/共30页定义形式:数据类型 (*指针名)数组大小如:int (*p)4;()不能少int(*p)4与int*p4不同p的值是一维数组的首地址,p是行指针可让p指向二维数组的某一行 如:int a34,(*p)4=a;一维数组指针变量维数和二维数组列数必须相同通过指向一维数组的指针变量来引用数组元素一维数组指针变量维数和二维数组列数必须相同第19页/共30页第18页/共30页a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或*p+1p1+2或*(p+1)+2*(*p+1)或(*p)1*(*(p+1)+2)int a34,(*p)4=a;通过指向一维数组的指针变量来引用数组元素int a34,(*p)4;p=a;第20页/共30页第19页/共30页main()static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int i,j,(*p)4;for(p=a,i=0;i3;i+,p+)for(j=0;j4;j+)printf(%d,*(*p+j);printf(n);p=a0;p=*a;p=&a00;p=&a0;a00a01a10a11a20a21a02a03a12a13a22a23ppp*(*a+j)p0j通过指向一维数组的指针变量来引用数组元素第21页/共30页第20页/共30页实参形参数组名int x4指针变量int (*q)4数组名int x4指针变量int(*q)4数组名a数组名a指针变量p1指针变量p1 int *p2=a0;指针变量p2指针变量int *q 若 int a34,(*p1)4=a;第四节 二维数组名和指针数组作为实参第22页/共30页第21页/共30页定义含义int i;int *p;int an;int *pn;int (*p)n;int f();int*p();int(*p)();int*p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量指针的数据类型小结第23页/共30页第22页/共30页第五节 二维数组程序举例将二维数组行列元素互换,存到另一个数组中a=1 2 34 5 6b=1 42 53 61:a00,b002:a01,b103:a02,b204:a10,b015:a11,b116:a12,b21#include main()int a23=1,2,3,4,5,6;int b32,i,j;printf(array a:n);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(%5d,aij);bji=aij;printf(n);printf(array b:n);for(i=0;i=2;i+)for(j=0;j2!1答案答案:D:D第26页/共30页第25页/共30页真题分析2008年9月(35)有以下程序#include#define N 4void fun(int a N,int b)int i;for(i=0;iN;i+)bi=aii;main()int x N=1,2,3,4,5,6,7,8,9,10,yN,i;fun(x,y);for(i=0;iN;i+)printf(%d,yi);printf(n);程序的运行结果是()。A)l,2,3,4,B)1,0,7,0,C)1,4,5,9,D)3,4,8,10,答案答案:B:B1 2 3 04 0 0 05 6 7 89 10 0 0第27页/共30页第26页/共30页真题分析20082008年9 9月(36)有以下程序#include int fun(int(*s)4,int n,int k)int m,i;m=s0k;for(i=l;im)m=sik;return m;main()int a44=1,2,3,4),11,12,13,14,2l,22,23,24,31,32,33,34;printf(%dn,fun(a,4,0);程序的运行结果是()。A)4 B)34 C)31 D)32答案答案:C:C1 2 3 411 12 13 14 21 22 23 2431 32 33 34第28页/共30页第27页/共30页真题分析2008年9月(12)以下程序按下面指定的数据给x 数组的下三角置数,并按如下形式输出,请填空。4 43 73 72 6 92 6 91 5 8 101 5 8 10答案答案:【12】i【13】n#include main()int x44,n=0,i,j;for(j=0;j=j;【12】)n+;xij=【13】;for(i=0;i4;i+)for(j=0;j=i;j+)printf(%3 d,xij);printf(n);第29页/共30页第28页/共30页知识点分析题型:上机、笔试都有。重点掌握:n二维数组的定义、元素的引用及初始化的方法n用指针表示对二维数组元素及其地址的方法n数组名做函数的参数第30页/共30页第29页/共30页感谢您的观看!第30页/共30页