1、好好考(),全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 真题分析,第一节 二维数组的定义,定义形式:数据类型 数组名常量表达式1常量表达式2 数组元素的存放顺序 内存是一维的 按行序优先,如:int a32;,int a32,a01,a10,a11,a20,a21,a00,a00 a01 a10 a11 a20 a21,例 int a34;,二维数组的理解:特殊的一维数组,每个元素ai各包含4个元素 分别为:ai0, ai1, ai2, ai3,二维数组a由3个元素组成: a0
2、、a1、a2,a01,a02,a03,a10,a11,a00,a13,a20,a21,a22,a23,a12,a0,a1,a2,分行全部初始化,第二节 二维数组的初始化及引用,第二节 二维数组的初始化及引用,分行部分初始化,分行初始化,省略第一维的大小,第二节 二维数组的初始化及引用,按元素排列顺序初始化,第二节 二维数组的初始化及引用,按元素排列顺序部分初始化,第二节 二维数组的初始化及引用,按元素排列顺序初始化,省略第一维大小,第二节 二维数组的初始化及引用,引用形式 数组名下标下标,第二节 二维数组的初始化及引用,如:int a23; 可以引用的数组元素有: a00, a01,a02,
3、a10,a11, a12;,二维数组的地址,对于一维数组: (1)数组名array表示数组的首地址,即array0的地址; (2)数组名array是地址常量 (3)array+i是元素arrayi的地址 (4)arrayi *(array+i),第三节 二维数组和指针,对于二维数组: (1)a是数组名。 包含三个元素 :a0,a1,a2 (2)每个元素ai又是一个一维数组,包含4个元素: ai0、 ai1、 ai2、 ai3,int a34;,二维数组的地址,对二维数组 int a34,有 a-二维数组的首地址,即第0行的首地址 a+i-第i行的首地址 ai *(a+i)-第i行第0列元素的地
4、址 ai+j *(a+i)+j -第i行第j列元素的地址 *(ai+j) *(*(a+i)+j) aij,a+i &ai,表示第i行首地址,指向行 ai *(a+i) &ai0,表示第i行第0列元素地址,指向列,2000,2004,2010,2014,2020,2024,a,a+1,a+2,二维数组的地址,二维数组元素表示形式: (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;,元素地址表示: (1) &a12 (2) a1
5、+2 (3) *(a+1)+2 (4)&a00+1*4+2,二维数组的地址,二维数组的地址,指向二维数组元素的指针变量,例 指向二维数组元素的指针变量,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 *p3,a34,i,j;,表示p是一个数组名,该数组类型为指针类型,即数组的3个元素均为指针类型的数据。注意: int *p4与int (*
6、p)4代表不同的含义。,指针数组用法举例,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“); , pij,p0=*a; p0=,* (ai+j),aij,定义形式: 数据类型 (*指针名)数组大小 如: int (*p)4;,( )不能少 int (*p)4与int *p4不同,p的值是一维数组的 首地址,p是行指针,可让p指向二维数组的某一行如:int a34, (*p)4=a
7、;,一维数组指针变量维数和 二维数组列数必须相同,通过指向一维数组的指针变量来引用数组元素,一维数组指针变量维数和 二维数组列数必须相同,a00,a01,a10,a11,a20,a21,a02,a03,a12,a13,a22,a23,p,p+1,p+2,p0+1或 *p+1,p1+2或 *(p+1)+2,*(*p+1)或 (*p)1,*(*(p+1)+2),int a34, (*p)4=a;,通过指向一维数组的指针变量来引用数组元素,int a34, (*p)4; p=a;,main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int i,j
8、,(*p)4;for(p=a,i=0;i3;i+,p+)for(j=0;j4;j+)printf(“%d “,*(*p+j);printf(“n“); ,a00,a01,a10,a11,a20,a21,a02,a03,a12,a13,a22,a23,p,p,p, *(*a+j), p0j,通过指向一维数组的指针变量来引用数组元素,若 int a34, (*p1)4=a;,第四节 二维数组名和指针数组作为实参,指针的数据类型小结,第五节 二维数组程序举例,将二维数组行列元素互换,存到另一个数组中,1:a00,b00 2:a01,b10 3:a02,b20 4:a10,b01 5:a11,b11
9、6:a12,b21,真题分析,2008年4月 (24)以下错误的定义语句是( )。 A)int x 3=0,1,1,2,3; B)int x43=1,2,3,1,2,3,1,2,3,1,2,3; C)int x4 =1,2,3,1,2,3,1,2,3,1,2,3; D)int x 3=1,2,3,4;,答案:C,真题分析,2008年4月 (26)若有定义:int a23;, 以下选项中对a 数组元素正确引用的是( )。 A)a2!1 B)a23 C)a 03 D)a12!1,答案:D,真题分析,2008年9月 (35)有以下程序 #include #define N 4 void fun(in
10、t 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,2 3 00 0 06 7 8 9 10 0 0,真题分析,2008年9月 (36)有以下程序 #include int fun(int (*s)4,int n, int k)
11、 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,2 3 4 11 12 13 1421 22 23 24 31 32 33 34,真题分析,2008年9月 (12)以下程序按下面指定的数据给x 数组的下三角置数,并按如下形式输出,请填空。 4 3 7 2 6 9 1 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“);,知识点分析,题型:上机、笔试都有。 重点掌握: 二维数组的定义、元素的引用及初始化的方法 用指针表示对二维数组元素及其地址的方法 数组名做函数的参数,