二维数组格式:
数据类型 数组名[行][列] =
{
{值1,值2},
{值3,值4}
}
代码:
int arr[2][3] = { {1,2,3},{4,5,6} };
那么我们怎么找它的下标呢,我先上一副图:
假如我现在要找1,那么它的下标就会是arr[0][0];
我们知道一维数组的求个数是:
由整个数组的大小/第一个数组元素的大小
sizeof(arr)/sizeof(arr[0])
那么我们二维数组的个数以及值要怎么求呢:
代码:
printf("二维数组大小=%d\n",sizeof(arr));//行*列*数据类型大小
printf("二维数组一行大小:%d\n",sizeof(arr[0]));
printf("二维数组元素大小:%d\n",sizeof(arr[0][0]));
printf("二维数组行数:%d\n", sizeof(arr)/sizeof(arr[0]));
printf("二维数组列数:%d\n",sizeof(arr[0]) / sizeof(arr[0][0]));
解释一下
- sizeof(arr)=整个二维数组的大小
- sizeof(arr[0])=二维数组第一行(下标0)的大小
- sizeof(arr[0][0])=二维数组单个元素的大小
接下来我们计算:
- sizeof(arr)/sizeof(arr[0])=整个二维数组的大小/二维数组第一行(下标0)的大小=行数 举个例子:总值=大小*单数
- sizeof(arr[0])/sizeof(arr[0][0])=第一行(下标0)的大小/单个元素的大小=单行的数量
我们来给数组赋值:
int arr[2][3] = { {1,2,3},{4,5,6} };
输出:
接下来我们看看二维数组地址的变化:
代码:
int main()
{
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
//二维数组首地址
printf("%p\n", arr);
printf("%p\n", arr[0]);
printf("%p\n",&arr[0][0]);
system("pause");
return EXIT_SUCCESS;
}
输出:
没错。我们发现arr=arr[0]=arr[0][0]
说明取的依然是首地址
我们现在改一下下标
代码:
printf("%p\n", arr);
printf("%p\n", arr[1]);
printf("%p\n",&arr[1][1]);
输出:
没错,它们还是连续性的,并且每个元素相隔的规律和一维数组一样
接下来我们遍历一下二维数组的地址
代码:
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%p\n",&arr[i][j]);
};
输出:
这证明了我们的结论是完全正确的
同时二维数组还有三种写法
代码:
int arr[2][3] = { {1,2,3},{4,5,6} };
int arr[2][3] = { 1,2,3,4,5,6 };
int arr[][3] = { 1,2,3,4,5,6 };
输出:
都是可以的