数组(二)
1、二维数组的定义
-
定义方式:(声明时列数不能省略,行数可以省略)
数据类型 数组名[常量表达式] [常量表达式];
如:int a[3] [4];3行4列
元素个数=行数*列数
-
数组元素的存放顺序
-
原因:内存是一维的
-
二维数组:按行序优先
-
2、二维数组的理解
-
二维数组a是由3个元素组成,每个元素a[i]由包含4个元素的一组数组组成。
-
二维数组可以认为是由多个一维数组构成
-
实例:
数组遍历输出,取地址
#include <stdio.h> int main() { int a[2][3]; int i, j; for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++) printf("%p ", &a[i][j]); putchar('\n'); } printf("%p %d\n", a, sizeof(a));//数组名为内存首地址,sizeof(数组名)是数组占用的总内存空间 printf("%p %d\n", a[0], sizeof(a[0])); printf("%p %d\n", a[1], sizeof(a[1])); //a[1][0]的地址接在a[0][3]的后面 return 0; }
运行结果:
array$ ./arr 0x7ffeaaecd190 0x7ffeaaecd194 0x7ffeaaecd198 0x7ffeaaecd19c 0x7ffeaaecd1a0 0x7ffeaaecd1a4 0x7ffeaaecd190 24 0x7ffeaaecd190 12 0x7ffeaaecd19c 12
3、二维数组元素的引用
-
形式:数组名[下标] [下标]
-
二维数组元素的初始化
-
分行初始化
-
按元素排列顺序初始化
-
几种初始化如下
-
实例如下
全部初始化
#include <stdio.h> int main() { int a[2][3] = {{1,6,9},{2,5,8}}; int i, j; for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:
array$ ./app 1 6 9 2 5 8
部分初始化
#include <stdio.h> int main() { int a[2][3] = {{1,6},{2}}; int i, j; for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:
array$ ./app 1 6 0 2 0 0
第一维长度省略初始化
#include <stdio.h> int main() { int a[][3] = {{1,2,3},{4}}; int i, j; for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:
array$ ./app 1 2 3 4 0 0
行列部分初始化
#include <stdio.h> int main() { int a[2][3] = {{1,2}}; int i, j; for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:
array$ ./app 1 2 0 0 0 0
3*3数组
#include <stdio.h> int main() { int a[3][3] = {{1},{2,3},{4}}; int i, j; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:
/array$ ./app 1 0 0 2 3 0 4 0 0
初始化省略列
#include <stdio.h> int main() { int a[3][] = {{1},{2,3},{4}}; int i, j; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:错误,数组类型不完整
error: array type has incomplete element type ‘int[]’ int a[3][] = {{1},{2,3},{4}};
-
4、程序举例
打印杨辉三角的前十行。
-
思考:1.打印出正方形;2.调整打印出下三角;3.调整值
#include <stdio.h> int main() { int a[10][10] = {{0}}; int i, j; for(i = 0; i < 10; i++){ a[i][0] = 1; for(j = 1; j <= i; j++) a[i][j] = a[i-1][j-1] + a[i-1][j]; } for(i = 0; i < 10; i++){ for(j = 0; j <= i; j++) printf("%-4d ", a[i][j]); putchar('\n'); } return 0; }
运行结果:
array$ ./app 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
5、总结与思考
主要讲解了二维数组的用法,包括二维数组的定义,引用,初始化,存储等。
-
思考:有一个3*4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。
#include <stdio.h> int main() { int a[3][4] = {{2,5,8,9},{22,25,28,27},{5,6,8,35}}; int i, j; int row, column; row = column = 0; for(i = 0; i < 3; i++){ for(j = 0; j < 4; j++){ if(a[row][column] < a[i][j]){ row = i; column = j; } } } for(i = 0; i < 3; i++){ for(j = 0; j < 4; j++) printf("%d ", a[i][j]); putchar('\n'); } printf("max = %d row = %d column = %d\n", a[row][column], row, column); return 0; }
运行结果:
array$ ./app 2 5 8 9 22 25 28 27 5 6 8 35 max = 35 row = 2 column = 3