目录
一. 前言
二. 利用索引遍历二维数组
三. 利用指针遍历二维数组
一. 前言
首先再对二维数组的概念进行以下解读:二维实际上就是由若干个一维数组组成的数组。也就是把很多个小数组放到了一个大数组里面。
二. 利用索引遍历二维数组
要对二维数组进行遍历,首先我们就得先定义一个二维数组,如下代码所示:
int arr[3][4]=
{{1,2,3,4},{11,12,13,14},{21,22,23,24}
}
这是二维数组的第一种定义方式,也就是把所有的一维数组一起定义到二维数组arr当中。
定义好二维数组之后,我们就可以开始进行遍历了,第一种方式的遍历代码如下:
for(int i=0;i<3;i++)
{ for(int j=0;j<4;j++){printf("%d ",arr[i][j]);}//每遍历完一个一维数组,进行换行操作printf("\n");
}
其中arr[i]是指向arr这个二维数组当中的一维数组的指针地址存储的值,例如arr[0]也就是第一个一维数组{1,2,3,4},而arr[i][j]则是这个一维数组的偏离,也就是遍历了这个一维数组里面的每一个值。
第一种方式定义二维数组有一个弊端,那就是需要二维数组里面的每一个一维数组的长度都要是一样的。为了解决这个弊端,我们有第二种定义的方式。第二种定义方式的代码如下:
//定义三个一维数组
int arr1[3]={1,2,3};
int arr2[4]={4,5,6};
int arr3[5]={11,12,13,14,15};// 将三个一维数组的内存地址都放在一个arr当中,数据类型是int*
int* arr[3]={arr1,arr2,arr3};
这个就是我们二维数组的第二种方式,其中arr数组里面存放的是int类型的指针,指向定义好的三个一维数组。
下面我们来进行遍历:
//提前准备好三个一维数组的长度,并把它们赋值给一个数组
int len1=sizeof(arr1)/sizeof(int);
int len2=sizeof(arr2)/sizeof(int);
int len3=sizeof(arr3)/sizeof(int);int lenarr[3]={len1,len2,len3};for(int i=0;i<3;i++)
{//访问每一个一维数组的时候,长度都不一样for(int j=0;j<lenarr[i];j++){printf("%d ",arr[i][j]);}printf("\n");
}
在我们遍历的时候,由于每一个一维数组的长度都不一样,在书写内层循环j的时候,j小于多少并不清楚。因此我们选择在外面准备好长度,用来遍历。注意这里不能在for循环里面定义,因为一旦arr数组参与了运算,它就会退化为指向第一个元素的指针。
三. 利用指针遍历二维数组
还是老样子,首先我们定义一个二维数组,接着获取这个二维数组的指针。代码如下:
//使用第一种方式定义一个二维数组
int arr[3][4]=
{{1,2,3,4},{11,22,33,44},{111,222,333,444}
}//获取二维数组的指针
int (*p)[4]=arr;
其中,获取二维数组的指针,我们是可以这样写的int[4] *p=arr;因为int[4]就是arr里面存放的一维数组的数据类型,注意这里是int[4]而不是int,因为int只是一维数组里面数据的数据类型,而我们这里要写的是一维数组的数据类型。 然后由于书写格式的问题,我们一般习惯写成int*p[4]的形式,但为了不被别人误解,这定义了一个数组,所以中间的内容需要括起来,也就是int (*p) [5]。
下面我们开始进行遍历,遍历代码如下所示:
for(int i=0;i<3;i++)
{for(int j=0;j<4;j++){//*p表示指向第一个一维数组的第一个元素,当*p+j的时候就表示第一个一维数组的所有元素的地址//这时候再对*p+j进行解引用,就能打印出一维数组里面的元素了printf("%d ",*(*p+j));}printf("\n");//让p指针指向下一个一维数组p++;
}
下面我们用第二种方式定义二维数组,并获取它的指针。如下所示:
int arr1[3]={1,2,3};
int arr2[4]={1,2,3,4};
int arr3[5]={1,2,3,4,5};//把三个一维数组的内存地址,再放到二维数组当中
int* arr[3]={arr1,arr2,arr3};//获取指针,这里arr的数据类型是int*
int* *p=arr;
注意,此时这里arr数组里面存放数据的数据类型发生了改变,不再是int[4]了,而是int*,因为arr数组里面存放的arr1,arr2,arr3都是指针类型的,都是一个指向各自一维数组的地址。
我们接着来进行遍历:
for(int i=0;i<3;i++)
{for(int j=0;j<4;j++){printf("%d ",*(*p+j));}printf("\n");p++;
}
以上便是我们利用索引和指针对二维数组的两种不同定义方式进行遍历的所有内容。