一维数组的局限性
在统计数据时,数据的量很大时,一维数组的限制就很明显:在统计五年内每个月的降水量数据总共需要60个元素,使用一维数组就显得非常笨拙,无论是创建一个包含了60个月的数组还是创建五个一年的数组。
处理这种数据包要经常使用数组的数组,即二维数组。主数组包含多个元素,每个元素均为内含多个元素的数组。案例的解决方法如下所示:
float rain[60]; //一维数组,60个月的数据集中在一起,元素查询非常繁琐
float rain[5][12] //二维数组,主函数包含5个主元素,每个主元素中包含12个元素
//float——数据类型
//rain——数组名
//[5]——rain是一个内含5个元素的数组
//[12]——每个元素都是一个内含12个float类型值的数组
5个数组,从0开始,0~4依序排列
12个元素,从0开始,0~11依序排列
比如要提取4行10列的元素,则要输入printf("%.1f",rain[3][9]);
初始化
二维数组的初始化建立在初始化一维数组的基础上。初始化一维数组如下:
const ra[5]={1,2,3,4,5}; //一维数组初始化值
也就是说若rain每个元素是一个内含12个整型元素的数组,那么ra是 一个由5个数组成的数值列表,rain的初始化需要用逗号分隔数值列表:
int arr[2][5]={{10,11,12,13,14},{20,21,22,23,24}}; //二维数列初始化方案
int arr[2][5]={10,11,12,13,14,20,21,22,23,24}; //初始化时可以省略内部的花括号。只要保证数值正确,初始化结果就和列表相同。但若初始化数值不足,则需要按照顺序初始化,直到用完所有的值,后面没有被初始化的元素统一初始化为0:
int arr[2][5]={{10,11,12},{20}}; //初始化数值不足,则需要按照顺序初始化,直到用完所有的值,后面没有被初始化的元素统一初始化为0.
int arr[2][5]={0}; //全部清零、初始化为0
元素易位
/*
将一个二维数组的行和列元素互换,存到另一个二维数组中。
arr_01[3][5]
列 0 1 2 3 4
行
0 10 11 12 13 14
1 20 21 22 23 24
2 30 31 32 33 34
arr_02[5][3]
列
行 0 1 2
0 10 20 30
1 11 21 31
2 12 22 32
3 13 23 33
4 14 24 34
arr1[3][5]→arr2[5][3]
*/
#include<stdio.h>
int main()
{
int arr1[3][5]; //定义数组
int i,j; //i控制行,j控制列
int arr2[5][3]; //定义目标数组
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
arr1[i][j]=10*i+j; //给数组各元素赋值
}
}
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("arr[%d][%d]=%d\t",i,j,arr1[i][j]); //输出初始数组
}
printf("\n");
}
printf("\n");
for(j=0;j<5;j++)
{
for(i=0;i<3;i++)
{
arr2[j][i]=arr1[i][j]; //用循环数组元素易位
printf("arr[%d][%d]=%d\t",j,i,arr2[j][i]); //输出目标数组
}
printf("\n");
}
return 0;
}