3、二维数组
3.1 二维数组的创建
//二维数组 int arr[3][4];//三行四列 char arr[3][5];//三行五列 double arr[2][4];//两行四列
3.2 二维数组的初始化
二维数组也是的行列也是从 0 开始的,它是一行放满了再放下一行。
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
比如这个代码:
#include <stdio.h> int main() { int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%3d", arr[i][j]); } printf("\n"); } return 0; }
效果展示:
注:二维数组的列不能省略,行可以省略
二维数组也可以不完全初始化,我们来看看效果:
没有初始化的部分也是用 0 来代替。
二维数组想要找哪个元素也是用下标来找
比如:在一下代码找第二行第一列的数字
#include <stdio.h> int main() { int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; printf("%d", arr[1][0]); return 0; }
效果展示:
要找哪一行那一列的数字就给相对应的横纵坐标各 -1 处理。
如果我们想要给每一行放入我们想要放入的数字可以使用下面的方法:
比如,第一行放入1 2 3,第二行放入4 5 6,第三行放入7 8 9。
int arr[3][4] = { {1,2,3},{4,5,6},{7,8,9} };//每一行的数在使用一个{}括起来
效果展示:
这样就可以得到我们想要的结果了。
3.3 二维数组的使用
二维数组的使用也是通过下标的方式。
看代码:
#include <stdio.h> int main() { int arr[3][4] = { 0 }; int i = 0; for (i = 0; i < 3; i++)//行:0 1 2 { int j = 0; for (j = 0; j < 4; j++)//列:0 1 2 3 { arr[i][j] = i * 4 + j; } } //打印 for (i = 0; i < 3; i++)//0 1 2 { int j = 0; for (j = 0; j < 4; j++)//0 1 2 3 { printf("%2d ", arr[i][j]); } printf("\n"); } return 0; }
效果展示:
3.4 二维数组在内存中的存储
我们还是模仿一维数组,把二维数组的地址打印出来看看
看代码:
#include <stdio.h> int main() { int arr[3][3] = { 0 }; int i = 0; for (i = 0; i < 3; i++)//行:0 1 2 { int j = 0; for (j = 0; j < 4; j++)//列:0 1 2 3 { printf("%p\n", &arr[i][j]); printf("\n"); } } return 0; }
效果展示:
地址仍然是十六进制表示的,并且我们不难发现二维数组是和一维数组一样是连续的,也还是相差 4 ,因为是整形。
如图:
如果我们访问每一行的各个元素:
arr[1][j];//第一行 arr[2][j];//第二行 arr[3][j];//第三行
我们可以将它拆解为三行,每一行就可以看作一个一维数组,那么每一行的一维数组也有数组名。arr[0]就是第一行的数组名;arr[1]就是第二行的数组名;arr[2]就是第三行的数组名。多行就以此类推。
4、数组越界
数组下标是有范围的限制。
数组的下标规定从 0 开始的,如果数组有 n 个元素,最后一个元素的下标就是 n-1.
所以数组的下标如果小于 0 ,或者大于 n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员在写程序时,最好自己做越界的检查。
二维数组的行、列也有可能存在越界。