二:二维数组的创建和初始化
2.1二维数组的创建
2.2二维数组的初始化
2.4二维数组在内存中的储存
三.数组越界
上一章学习了一维数组的创建和初始化,二维数组和一维数组本质上是差不多的,所以掌握一维数组就能较容易的学会二维数组,那么下面我们一起进入对二维数组的学习吧。
2.1.二维数组的创建
//数组的创建
int arr[3][4];
char arr[3][4];
double arr[3][4];
//[]中的数字代表这个二维数组是3行4列的
2.2.二维数组的初始化
#include<stdio.h>
int main()
{
int arr[3][4]={1,2,3,4};//因为这个二维数组是三行四列的,从大括号内第一个元素开始排列,不足的用0代替
return 0;
}
我们可以得到:
如果我们想要将上面这个二维数组大括号内的元素排列在的每行前两个位置上:
#include<stdio.h>
int main()
{
int arr2[3][4]={{1,2},{3,4}};
return 0;
}
需要注意的是:二维数组如果有初始化,行可以省略,但是列不可以省略。
如:
#include<stdio.h>
int main()
{
int arr3[][4]={{1,2},{3,4}};//在行省略的情况下,二维数组会根据大括号内列的排列判断出行数
return 0;
}
那么我们有个问题,那就是为什么行可以省略,列不可以省略呢?
我们可以把二维数组看成由多个一维数组组成的,我们只有在确定每个一维数组存放多少个元素才能确定二维数组。假设我们省略列,那么操作系统就不知道每个一维数组分配多少个元素,从而造成二维数组的混乱。所以只有确定了列数,操作系统才能正确分配出二维数组。
2.3二维数组的使用
二维数组的使用也是通过下标的方式实现的。
#include<stdio.h>
int main()
{
int arr4[][2]={1,2,3,4,5,6,7,8,9};//根据二维数组的定义可得,该二维数组是五行两列的
int i=0;
for(i=0;i<5;i++)
{
int j=0;
for(j=0;j<2;j++)
{
printf("%d ",arr4[i][j]);
}
printf("\n");
}
return 0.
}
结果可得:
2.4二维数组在内存中的储存
#inclide<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 i=0;
for(j=0;j<4;j++)
{
printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
}
}
return 0;
}
十六进制,每个元素之间也相差四个字节
二维数组在内存中也是连续存在的。
#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++)//求行数我们也可以写成sizeof(arr)/sizeof(arr[0])
{
int j = 0;
for (j = 0;j < 4;j++)//求列数可以写成sizeof(arr[0])/sizeof(arr[0][0])
{
printf("%d ", arr[i][j]);
}
}
printf("\n");
int* p = &arr[0][0];
int k = 0;
for (k = 0;k < 12;k++)
{
printf("%d ", *(p + k));
}
return 0;
}
结果为:
无论是通过下标还是地址都可以打印出来。
二维数组也可以看成一维数组组成的。
三.数组越界
数组的下标是有限制的。
数组的下标是从0开始的,如果数组有n个元素,则最后一个元素的下标是n-1.
所以数组的下标如果小于0,或者大于n-1的话,就属于研越界访问了,超出了合法的空间访问。
错误如下:
#include<stdio.h>
intmain()
{
int arr[10]={0};
//0~9
int i=0;
for(i=0;i<=10;i++)
{
printf("%d ",arr[i])
}
return 0;
}
打印最后一个不是范围内的值,而是打印出了一个随机值,但是编译器并没有报错。虽然编译器没有报错,但是并不能说明程序是正确的。所以看到类似情况,就应该自己检查出数组越界的问题。
至此结束,感谢各位佬纠错