文章目录
一、两种二维数组初始化定义方法
int arr[3][5] = {
{1,2,3,4,5},
{11,22,33,44,55},
{6,5,4,3,2}
};
第一种初始化方法比较直观,即大括号内包含3对一维数组,每对一维数组的长度都为5,这种方法适合于一维数组长度固定的二维数组,缺陷性太大
int arr1[4] = { 1,2,3,4 };
int arr2[5] = { 6,7,8,9,10 };
int arr3[6] = { 11,12,13,14,15,16};
int* arr[3] = { arr1,arr2,arr3 };
第二种方法就灵活性很多,三对一维数组长度可以自由定义,我着重写一下第四行代码int* arr[3] = { arr1,arr2,arr3 },这里其实用到了指针的概念,大家要知道数组名即这里的arr1,arr2,arr3是各自数组0索引的地址,也就是指向首个元素的地址,不能将它看为是整个数组,而指针是指向内存的地址,所以这里定义就要写为指针数组
二、索引遍历
1.
#include<stdio.h>
int main()
{
int arr[3][5] = {
{1,2,3,4,5},
{11,22,33,44,55},
{6,5,4,3,2}
};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
第一种方法比较容易理解,两个for循环嵌套,实现对二维数组中元素的遍历
2.
#include<stdio.h>
int main()
{
int arr1[4] = { 1,2,3,4 };
int arr2[5] = { 6,7,8,9,10 };
int arr3[6] = { 11,12,13,14,15,16};
int* arr[3] = { arr1,arr2,arr3 };
int len1 = sizeof(arr1) / sizeof(int);
int len2 = sizeof(arr2) / sizeof(int);
int len3 = sizeof(arr3) / sizeof(int);
int len[3] = {len1,len2,len3};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < len[i]; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
第二种方法大家可以看到我首先求了三个一维数组的长度,之后又定义了一个二维数组用来存放长度,我为何不直接在for循环里这样写呢:
for (int i = 0; i < 3; i++)
{
int len = sizeof(arr[i]) / sizeof(int);
for (int j = 0; j < len; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
首先我先将这种写法的运行结果给大家展示一下
大家可以看到每个一维数组最终只输出了前两个元素,为什么会这样呢,这是因为:
在64位的操作系统中,一共有64个bit位,而在 int len = sizeof(arr[i]) / sizeof(int)中,我们上文写过,一旦数组arr参与计算的时候,数组会退化为第一个元素的指针,而64位操作系统中,数组所占的字节数是8,int所占字节数是4,两者相除,最后得到的长度不就为2了么。
所以这种写法行不通,就需要我们再定义一个二维数组用来存放三个一维数组的长度。