二维数组的概念:
前面我们学习了一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这个时候就是二维数组,
1 | 2 | 3 | 4 | 5 |
int int int int int
一维数组
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 |
int int int int int
二维数组
如果二维数组作为数组元素的数组被称为三维数组
二维数组的创建:
type arr_name[常量值1][常量值2]
//例如
int arr[3][5];
double data[2][8];
常量值1代表行,常量值2代表列。
arr[3][5]的存储空间如下:
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
二维数组的初始化:
1.不完全初始化:
int data[3][5]={1,2,3};
2.完全初始化:
int data[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
3.按行初始化:
int data[3][5]={ {1,2},{3,4},{5,6} };
效果如下:(没有赋值的系统默认为0)
1 | 2 | 0 | 0 | 0 |
3 | 4 | 0 | 0 | 0 |
5 | 6 | 0 | 0 | 0 |
注意点:初始化行可以省略,列不能省
int arr5[][5]={1,2,3};
int arr6[][5]={1,2,3,4,5,6,7};
int arr7[][5]={ {1,2},{3,4},{5,6} };
arr5只有三个元素,第一行都放不满,所以系统会给他一行
1 | 2 | 3 | 0 | 0 |
arr6超过5个,系统给他两行。
1 | 2 | 3 | 4 | 5 |
6 | 7 | 0 | 0 | 0 |
arr7有三个{ },所以有三行。
二维数组的使用:
二维数组的使用也是通过下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素
行和列的下标都是从0开始的,
下标 | 0 | 1 | 2 | 3 | 4 |
0 | 1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 | 6 |
2 | 4 | 2 | 5 | 6 | 7 |
printf("%d\n",arr1[1][1]); // 就是访问3
打印二维数组所以元素:
int main()
{
int arr[3][5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
int i=0;//行
for(i=0;i<3;i++)
{
//列
for(j=0;j<5;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");//打印一行后换行
}
return 0;
}
输入二维数组的值:
int main()
{
int arr[3][5]={0};
int i=0;//行
for(i=0;i<3;i++)
{
int j=0;
for(j=0;j<5;j++)
{
scanf("%d",&arr[i][j]);
}
}
return 0;
}
输入方式可以很随意。系统会跳过你输入的空格的,
当然,换种方式也可以先定义列,在来定义行,效果是一样的。
二维数组在内存中的存储:
int main()
{
int arr[3][5] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d]=%p\n",i ,j,&arr[i][j]);
}
}
return 0;
}
在内存中,二维数组存储方式如下:
0 | 1 | 2 | 3 | 4 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 2 | 3 | 4 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
arr[0]【j】 | arr[1][ j ] | arr[3][ j ] |
arr[0]第一行数组名,arr[1]第二行数组名,arr[2]第三行数组名,对后面直针的理解非常重要。
二维数组在内存中也是连续存放的,二维数组每一行都是一维数组