C语言成长之路42:二维数组
声明:本笔记基于 B站UP主「来自程序员的暴击」的 「C语言成长之路」中对应课程;
1、二维数组的概念
一维数组通常成为向量,二维数组,最简单的理解是“有两个下标”,如果把一维数组理解为一行数据,那么,二维数组可以形象的表示行列结构,如:excel的表格
2、二维数组的格式:
数据类型 变量名[行个数][列个数] = {{一维数组},{一维数组},......}; int a[2][3] = {{1,2,3},{4,5,6}};
3、查看遍历二维输出,打印出里面每一个元素的值以及其内存地址
#include <stdio.h> int main(){ /* C语言成长之路42:二维数组 * */int a[2][3] = {{1,2,3},{4,5,6}}; printf("&a = %p,sizeof(a) = %d\n",a,sizeof(a)); for (int i = 0;i < 2;i++){ for (int x = 0;x < 3; x++){ printf("a[%d][%d] = %d,%p\n",i,x,a[i][x],&a[i][x]); } } }
打印结果如下:
&a = 005EFE50,sizeof(a) = 24 a[0][0] = 1,005EFE50 a[0][1] = 2,005EFE54 a[0][2] = 3,005EFE58 a[1][0] = 4,005EFE5C a[1][1] = 5,005EFE60 a[1][2] = 6,005EFE64
可以看书,数组里的每个元素也是连续排列的;
重点:二维数组的赋值方法:
int x[3][5] = {0}; for (int i = 0;i < 15;i++){ x[i / 5][i % 5] = i; }
完成后遍历一下,结果如下:
x[0][0] = 0,0073FA58 x[0][1] = 1,0073FA5C x[0][2] = 2,0073FA60 x[0][3] = 3,0073FA64 x[0][4] = 4,0073FA68 x[1][0] = 5,0073FA6C x[1][1] = 6,0073FA70 x[1][2] = 7,0073FA74 x[1][3] = 8,0073FA78 x[1][4] = 9,0073FA7C x[2][0] = 10,0073FA80 x[2][1] = 11,0073FA84 x[2][2] = 12,0073FA88 x[2][3] = 13,0073FA8C x[2][4] = 14,0073FA90
过程思考:
第一次循环:i = 0 --> i / 5 = 0;i % 5 = 0 -->x[0][0] = 0;
第二次循环:i = 1 --> i / 5 = 0;i % 5 = 1(1 / 5 = 0...1) -->x[0][1] = 1;
第三次循环:i = 2 --> i / 5 = 0;i % 5 = 2(2 / 5 = 0...2) -->x[0][2] = 2;
………………
第十五次循环:i = 14 --> i / 5 = 2;i % 5 = 4(14 / 5 = 2...4) -->x[2][4] = 14;
练习思考:
int bb[i][j] = i * 5 + j + 1
代码:
#include <stdio.h> int main(){ /* C语言成长之路42:二维数组 * */ // 练习理解 // int bb[i][j] = i * 5 + j + 1 int bb[3][5] = {0}; for (int i = 0;i < 3;i++){ for (int j = 0;j < 5;j++){ bb[i][j] = i * 5 + j + 1; } } for (int i = 0;i < 3;i++){ for (int j = 0;j < 5;j++){ printf("bb[%d][%d] = %d,%p\n",i,j,bb[i][j],&bb[i][j]); } } }
结果如下:
bb[0][0] = 1,00F3F958 bb[0][1] = 2,00F3F95C bb[0][2] = 3,00F3F960 bb[0][3] = 4,00F3F964 bb[0][4] = 5,00F3F968 bb[1][0] = 6,00F3F96C bb[1][1] = 7,00F3F970 bb[1][2] = 8,00F3F974 bb[1][3] = 9,00F3F978 bb[1][4] = 10,00F3F97C bb[2][0] = 11,00F3F980 bb[2][1] = 12,00F3F984 bb[2][2] = 13,00F3F988 bb[2][3] = 14,00F3F98C bb[2][4] = 15,00F3F990
过程思考:
由于是双层for循环结构,再进入第二个for的时候,会循环到条件不满足位置,才跳出循环,所以第一蹭循环的时候,i的值一直为0,即bb[0][j] = {};的情况,然后在j循环这一层循环了5次,j的值分别为0,1,2,3,4,第一次完整循环会产生:
bb[0][0],bb[0][1],bb[0][2],bb[0][3],bb[0][4]
而对应的值分别为:
0 * 5 + 0 + 1 = 1 ---->bb[0][0] = 1;
0 * 5 + 1 + 1 = 1 ---->bb[0][1] = 2;
0 * 5 + 2 + 1 = 1 ---->bb[0][2] = 3;
0 * 5 + 3 + 1 = 1 ---->bb[0][3] = 4;
0 * 5 + 4 + 1 = 1 ---->bb[0][4] = 5;
如此类推,就能按照特定的方式给二维数组赋值了;