1.二维数组的声明。
1)。二维数组首先是1个数组,所以它符合数组的特点
a.元素的类型相同。
b.存储的数据的个数固定。
c.方便管理数据。
2)。二维数组的独有的特点:
二维数组是1个有行有列的表格。使用单元格来存储数据。
单元格就是二维数组的元素。
3)。声明二维数组的语法。
元素类型 数组名[行数][列数];
int arr[1][2];
表示在在内存中声明了1个二维数组,这个二维数组的名字叫做arr这个二维数组表示1个1行2列的表格。
每1个单元格 就是这个二维数组的1个元素。每1个元素的类型是int
4)。术语。
a.元素:元素就是这个表格的每1个单元格。
二维数组的每1个元素的下标有两个1个是行下标 1个是列下标,先行后列
b.长度:我们一般认为就是单元格的个数,行*列。
2.往二维数组中存储数据
1)。二维数组中真正存储数据的是表格中的每1个元素。
使用下标来确定二维数组中的元素,二维数组的元素的下标有两个,行下标 列下标。
二维数组名[行下标][列下标]=数据;
int arr[3][4];
arr[1][2] =100:
将100存储到arr数组的第1行的第2列的那个元素中。
2)。为二维数组的元素赋值的数据的类型要和元素的类型一致
否则就会做自动类型转换。
3)。行列下标请不要越界。
3.从二维数组中取出数据
1)。二维数组中真正存储数据的是表格中的每1个元素。
二维数组名[行下标][列下标];
2).行列下标不要越界。
4. 遍历二维数组的元素。
for(int i = 0;i<行数;i++)
{
for(int j = 0;j <列数;j++)
{
arr[i][j];
}
#include<stdio.h>
int main()
{
int arr[2][3];//声明二维数组
arr[0][0]=1;//往数组中储存数据
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
for (int i = 0; i < 2; i++)//利用for循环遍历数据
{
for (int j = 0; j < 3; j++)
{
arr[i][j];
printf("%d\n", arr[i][j]);//将数据打印
}
}
return 0;
}
5.使用二维数组要注意的地方。
1).关于二维数组的行数和列数
a.在声明二维数组的时候 必须要指定行数和列数。
b.并且这个行数和列数:可以是变量、常量、宏、表达式,也可以是1也可以是0
行数和列数不能是小数、负数。
2)。关于二维数组的元素的默认值。
如果我们声明1个二维数组 没有为这个二维数组的元素。这个二维数组的元素是有值的 值是1个垃圾值。
6.二维数组的元素初始化
1)。全部初始化。
a.先声明,再使用下标来初始化。
b.在声明的同时,就初始化数组的每一个元素。
int arr[3][4] ={{10,20,30,40},//第0行的数据
{50,60,70,80},//第1行的数据
{90,100,110,120}//第2行的数据。};
里面的大括弧,就表示1行。
c.上面这种方式初始化的时候,可以省略行数。
int arr[][4] ={{10,20,30,40},//第0行的数据
{50,60,70,80},//第1行的数据
{90,100,110,120}//第2行的数据。};
根据大括弧的个数,编译器来自动确定行数。
d.直接省略里面的大括弧.编译器根据行数和列数自动判断哪些属于哪1行的,
int arr[3][4] = {10,20,30,40,50,60,70,80,90,100,110,120};
e.上面的那种初始化方式 可以省略行数。编译器根据列数和数据的个数自动计算行数。
int arr[][4] = {10,20,30,40,50,60,70,80,90,100,110,120};
2)。部分初始化。
a. int arr[3][4] = {{10},{20},{30}};
初始化指定行的数据,那么其他的元素就会被自动初始化为0。
10 20 30 0
0 0 0 0
0 0 0 0
b. int arr[3][4] = {10,20,30,40,50};
按照顺序去初始化每1个元素其他的元素的值就会被自动初始化为0
10 20 30 40
50 0 0 0
0 0 0 0
c.int arr[][4] = {10,20,30,40,50};
省略行数,自动根据后面的元素的个数来计算行。其他的元素自动初始化为0
10 20 30 40
50 0 0 0
0 0 0 0
d. int arr[3][4] = {[1]={10,20,30,40},[2]={50,60,70,80}};
给指定的行初始化,其他的元素自动初始化为00000
10 20 30 40
50 60 70 80
e. int arr[3][4] ={[0][1] = 20,[1][3] = 60};
给指定的元素赋值。其他的元素自动初始化为0
0 20 0 0
0 0 0 60
0 0 0 0
注意
1)。在声明二维数组的同时使用大括弧初始化数组的元素,这个时候行数可以省略。记住,列数不能省略。
2)。在声明二维数组的同时 如果不使用大括弧初始化元素 那么就必须要写行数和列数。
7.二维数组的储存
int arr[2][3];
1).从高地址向低地址申请了连续的(行 * 列 * 每1个元素占用的字节)个字节空间。
2)。第0行是在低字节,
二维数组在内存中仍然是1块连续的空间,并不是一个表格。第0行在低字节。
8. 二维数组的本质。
二维数组其实是一个一维数组。
只不过,这个一维数组的每一个元素的类型又是1个数组,
int arr[2][3];
这其实是1个一维数组,这个一维数组的长度是2。
只不过这个一维数组的元素的类型是 1个长度为3的数组。
所以,二维数组的每1行,其实是1个一维数组。
9.二维数组的地址
组成这个二维数组的低字节的地址就是这个二维数组的地址。
也就是第0行的地址。也就是第0行的第0个元素的地址,
二维数组名 就代表这个二维数组的地址。
二维数组的地址==二维数组名==二维数组的第0行的地址==二维数组的第0行的第0个元
10.二维数组的长度以及行列计算。
1)。求二维数组的长度,真正的元素的个数。
用二维数组占用的总的字节数除以 每1个元素占用的字节数。
2).求行数
二维数组的每1行占用的字节数是一样的。所以。
用总的字节数 除以每1行占用的字节数,就可以去到行数。
3).求列数。
每1行的总字节数 除以 每1个元素的字节数。
11.二维数组可以作为函数的参数。
1)。如果函数的参数是1个二维数组。那么在调用的时候,实参也必须是1个同类型的二维数组。
2)。当二维数组作为函数的参数的时候,会丢失这个二维数组的行数和列数。
因为声明参数二维数组的时候,并不是去创建1个二维数组。而是创建1个用来存储数组地址的指针变量而指针变量是占据8个字节,
所以这个时候,在函数的内部使用sizeof去计算参数二维数组的占用的字节的时候永远都是8个字节。
3)。当二维数组作为函数的参数的时候,
行数可以省略不写,但是列数不能省略必须要写。并且实参二维数组和形参二维数组
实参的行数可以任意,但是列数必须要和形参的列数一致。
4)。解决方案:
让调用者将二维数组的行数和列数都传递到函数内部来,所以,至少还要加2个参数,1个行 1个列.
实参二维数组的列数必须要和形参二维数组的列数一致。
写参数的时候,先写行数和列数,最后再写二维数组,然后二维数组的列数用参数指定。
void test2( int rows,int cols,int arr[[cols]);