二维数组
1、概念:
一维数组
相同数据类型的(有序)的数据集合。
二维数组
一维数组的每一个元素又是一个一维数组(嵌套)二维数组
2、定义和初始化
1)定义的时候初始化
一维数组:
数据类型 数组名[常量表达式]
int a[5]={1,2,34,5,6};
int a3[]={1,2,3,4};
int a4[5]={1,2}; //int a4[5]={1,2,0,0,0}
int a6[5]={[1]=45}; //int a6[5]={0,45,0,0,0};
二维数组
数据类型数组名[常量表达式1][常量表达式2]
int a1[3][2]={1,2,3,4,5,6};
int a2[3][2]={{1,2},{3,4},{5,6}};
int a5[3][3]={{1},{2},{3}};//相当于下面的数字矩阵
//
1 0 0
2 0 0
3 0 0
int a7[3][3]={{[1]=34},{[0]=10},{[2]=29}};
//
0 34 0
10 0 0
0 0 29
二维数组支持定义的时候,不指定第一维长度
int a8[][2]={1,2,3,4,5,6};
2)先定义后初始化
一维数组
int a9[3];
a9[0]=12;
二维数组
int a10[2][2];
a10[0][0]= 133;
a10[1][0]= 12;
3、数组的访问越界的问题
访问了不能访问的元素
对于一维数组来说:如果一维数组的长度为n ,下标:a[0]~a[n-1]
对于二维数组来说:如果二维数组int a[m][n],下标:a[0][0] ~ a[m-1][n-1]
除此之外,访问其他的元素都是越界
特别注意:数组的越界在我们的C99编译器下,不报错,也能执行。只不过获取的数据不是我们想要的
4、数组的访问
一维数组
数组名[下标]
二维数组
数组名[第一维下标][第二维下标]
5、数组的存储细节
不管是一维数组还是二维数组,在内存中存储都是连续的
对于二维数组来说,逐行存储。
一维数组:int a[3] a是常量他是一个地址
数组的首地址 = a = &a[0]
计算数组的长度:sizeof(a)/sizeof(int)
二维数组:
int a[2][2];
数组的首地值 = a = a[0] = &a[0][0]
二维数组的占用的总字节数:2*2*4 = 16
sizeof(a) = 16
二维数组的行数:sizeof(a)/sizeof(a[1])
列数:sizeof(a[0])/sizeof(int)
6、数组的遍历
逐个访问数组的元素。
for(int i=0;i<数组长度;i++){
a[i]
}
二维数组:
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
a[i][j]
}
}
7)数组和函数之间的关系
1)数组的元素作为函数的实参
值传递:把数组元素的值复制一份给形参
2)数组名作为函数的实参
地址的传递:把数组的首地址传递给函数的形参(让函数的形参也指向了数组的这个空间)