资源描述
对于一维数组 : ( 1)数组名 array表示数组的首地址,即 array0的地址; ( 2)数组名 array是 可以看做一个指针变量,但值是不能变化 故又称为地址常量。 ( 3) array+i是元素 arrayi的地址 即 array+i= 回顾 二维数组定义与元素引用 datatype arrayNamerowsizecolsize; int num42; 内存 num num00 num01 num10 num11 num20 num21 num30 num31 4 X 2 = 8 8*sizeof(int) 字节 num00 num01 num10 num11 num20 num21 num30 num31 num 为了便于理解,二维数组一般理 解为几行几列的矩阵 二维数组初始化 int books42 = 11, 1294,22,450, 33,4000, 44,79; int arr43 = 1,2, 4,5, 7, 10 ; int arr43 = 1,2, 4,5 ; int arr43 = 1,2,4,5 ; 没有花括号依次赋值,其余补零 通过赋初值定义二维数组的大小 int arr 3 = 1,2,3, 4,5, 6, 8 ; 由初值行数来确定第一维的大小 int arr 3 = 1, 2, 3, 4, 5; 第一 维的大小为: 1.数值数 %列数 =0,维数 =商 2.数值数 %列数! =0,维数 =商 +1 故 :上述等价于: int arr 23 = 1, 2, 3, 4, 5; int arr2 = 1,2,3, 4,5, 6, 8 ; 错误,可以省略行但不能省略 列 从终端设备二维数组赋值 int i, j, num42; for (i = 0; i = 3; i+) for (j = 0; j =1 ; j+) scanf(%d, i j numi j 0 0 100 0 1 200 1 0 300 1 1 400 2 0 500 2 1 600 3 0 700 3 1 800 第一行 第二行 第三行 第四行 第一列 第二列 (3,1) 800 (3,0) 700 (2,1) 600 (1,1) 400 (0,1) 200 (2,0) 500 (1,0) 300 (0,0) 100 行下标 列下标 num0 0 二维数组和指针 int a34; 对于一个二维数组可以看成一个一维数组,这个一维数组 的每个元素又是一个一维数组。如上:可以将二维数组 a 看成一个由 a0,a1,a2三个元素组成的一维数组,而每 个元素 a0,a1,a2分别又是由四个元素组成的一维数组。 如 a0元素又可由 a00, a01, a02, a03四个元素 组成的一维数组。 对于二维数组: ( 1) a是 数组名, 包含三个元素 a0,a1,a2 ( 2) 每个元素 ai 又是一个一维 数组,包含 4个 元素 int a34; a0 a1 a2 2000 2008 2016 2000 2002 2008 2010 2016 2018 a00 a01 a10 a11 a20 a21 a02 a03 a12 a13 a22 a23 前面对于一维数组学过 int a3数组名 a是一个地址常量, 或可以看做一个指针变量,值为第一个元素的地址 int a34; 首先讨论二维数组中的一维数组名: 二维数组 a34,包括 a0,a1,a2三个元素,每个元素又是 一个一维数组名。故 a0,a1,a2三个一维数组名分别代 表地址常量,或指针,值为每行第一个元素的地址。 讨论二维数组名: 二维数组名 a,包含着三个一维数组名(地址常量或指针) 的指针,值为第一个元素的首地址。 回顾二重指针: int *p,*a,k=10; a= p= p a k a0 a1 a2 2000 2008 2016 2000 2002 2008 2010 2016 2018 a00 a01 a10 a11 a20 a21 a02 a03 a12 a13 a22 a23 a a+1 a+2 int a34; a00 a01 a10 a11 a20 a21 a02 a03 a12 a13 a22 a23 二维数组元素表示形式: ( 1) a12 ( 2) *(a1+2) ( 3) *(*(a+1)+2) ( 4) *( 例 int (*p)4,a34; p先与 *结合,说明 p是一个指针变量 再与 结合,即 p指向一个含有 4个元 素的一维数组。在这里 p的类型与二维 数组名 a相同 ,因此合法赋值语句: p=a; 故 p+1=a+1,p+i=a+1 则可用以下形式来表示 aij *(pi+j) *(*(p+i)+j) (*(p+i)j pij 1.( )不能少, 2.p是 行指针 , 不是 数组名 3.一维数组指针变量 维数和二维数组 列 数 必须 相同 1. 若有以下定义 int x10,*pt=x; 则对数组元素的正确引用 是 A)*0=i4,则正 确的赋值是( ) A prt=a B qi=ai C prt=ai 3. 设 int( *p) 4;,则 p的含义是( )。 A指向整型变量的指针数组 B指向 4个整型变量的函数指针 C 4个指向整型变量的指针变量 D指向具有 4个整型元素的一维数组的指针 4. 课后题 9.12和 9.13 9.7二维数组名和指针数组作为参数 1.二维数组名 作为实参时,形参必须是一个指针变量 main() double sMN f (s); 则 f子函数: f(double (*a)N) f(double a N) f(double aMN) 系统将 a处理成行指针 2.指针数组名 作为实参时,形参必须是指向指针的数组 main() double sMN, *pM; for()pi=si; f (p); 则 f子函数可为如下之一: f(double *aM) f(double *a ) f(double *a ) 9.8二维程序举例 例题 9.11 编写程序,通过调用随机函数给 5*6的二维数组元素赋 10-40 范围内的整数,求出二维数组每行元素的平均值 思路: #include #include #define M 6 #define N 5 void getdata(int (*) M) void lineave(int M,float *) void outdata (int NM,float*) main 定义一个二维数组存放随机数; int rNM; 定义一个一维数组存放每行元素的平均值; inaveN; 调用一个子函数获得随机数; getdata(r); 调用一个子函数求二维数组的行平均值; lineave(r,ave); 调用一个子函数输出平均值: outdata(r,data); 注意格式:被调用函数的位置 函数原型:跟子函数函数一样 但可省略参数名称 获得随机数的子函数: void getdata(int (*sp) M) int i,j,x; for(i=0;iN;i+) /控制行数 j=0; while(j=10)/只有产生的随机数在 =10至 40之间才可放入数组 spij=x; j+; 求二维数组的行平均值: void lineave(int sp M,float *a) int i,j; float ave; for(i=0;iN;i+) ave=0.0;/每求完一行,重新将 ave赋值为 0.0 for(j=0;jM;j+) ave+=sij;/求每行的总和 ai=ave/M;/求行平均值存储于数组 a中 输出平均值的子函数: void outdata (int spNM,float a ) int i,j; printf(输出二维数组元素: n); for(i=0;iN;i+) for(j=0;jM;j+) printf(%4d,spij); printf(:%6.2fn,ai); 例题 9.12打印如下杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 1 1 6 15 20 1 思路:首先建立一个二维数组 根据规律给二维数组赋值 按照上述图形输出二维数组 规律: 1.第一列和斜对角线的元素为 1。 2.其他元素 =上一行的同列元素 +前列元素 for(i=0;in;i+) si0=1;sii=1; for(i=2;in;i+) for(j=1;jn;j+) sij=si-1j+si-1j-1; 规律:列数 =行数 for(i=0;in;i+) for(j=0;j=i;j+) printf(“%6d”,sij); 例题 9.13找出方阵每列中的最小元素及所在行号 23 87 10 44 11 91 66 24 5 51 31 2 19 91 28 65 40 9 6 39 22 35 49 82 76 思考: for(i=0;iN;i+) for(j=0;jN;j+) aij (位置是怎样变化的?若换成 aji呢? )
展开阅读全文