1,对二维数组的形象印记,特殊的一维数组;
2,二维数组的定义:数据类型 数组名 参数;
例如 一个int型的容量为4行5列的二维数组:int brr [4][5]={};第一个中括号里面的参数是行,第二个中括号里面的参数是列;
我们再定义的时候有以下要求;如果对二维数组进行了初始化,那么它的行参数可以省略,而列参数不能省略;
假如没有进行初始化,那么它的行和列参数都不能省略。
3,二维数组的保存:二维数组在我们看起来就像是矩阵一样的一组数据,实际上他在内存上任然是按照内存的顺序依次存储的,我们可以把二维数组中每一行数据看作是一个一维数组,而一个二维数组就是有【列】个一维数组。
我们看一个数组int brr[3][2]={{1,2},{3,4},{5,6}};
1== brr[0][0];数组序号为[0][0],保存的值是1; | 2 == brr[0][1] |
3== brr[1][0] | 4 ==brr[1][1] |
5 ==brr[2][0] | 6 ==brr[2][1] |
实际上它在内存中是这样的:
1==brr[0][0] | 2==brr[0][1] | 3==br[1][0] | 4==br[1][1] | 5==brr[2][0] | 6==b[2][1] |
4,二维数组的传参:回忆一维数组,在写功能函数的时候我们用如下形式
void Fun (int *arr, 其他参数)
在主函数我们给他传递参数的时候我们用如下形式;
Fun(arr,其他参数);
在一维数组中,写他的功能函数时,我们用指针将数组首元素地址的首地址传递给形参。
我们来看二维数组的传参:
在写功能函数的时候,我们用如下形式;
void Fun(int (*brr)[列参数],其它参数)
在主函数调用时,我们用如下形式
Fun(brr,其它参数);
我们发现在调用有二维数组的函数时我们的形式和一维数组看起来是一样的;
我们主要看形参的这一句:(*brr)[列参数],我们上面说吧二维数组看作是列个一维数组,所以这里我们先将数组的第一行这个“一维数组”整体用指针传递,在将列传递,这就完成了二维数组的传参。
5,二维数组的输出:我们用一下语句输出一个二位数组
void Show(int *brr,int row,int col)//row为二维数组的行,col为二维数组的列;
{
for (int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%4d",brr[i*col+j])
}
printf("\n");
}
}
从代码我们可以看到二维数组的输出我们把它转化为一维数组来输出;形参的传递和输出数我用的都是一维数组的形式。
我们看这个brr[i*col+j];我们要按照一维数组输出的话,数组序号就是0——(i*j-1),所以我们用公式i*col+j二维数组的参数一维数组的序号链接起来。
而在调用这个输出函数的时候我们给他传参如下;
Show( (int *)brr,其它参数);
由于我们输出函数是输出一维数组,所以我们再传参的时候就需要将brr这个二维数组强转为一维数组;
下面我们看一些二维数组的实例;
我们有一个二维数组 int brr[2][3]={{1,2,3},{4,5,6}};
(2)printf("*(*brr1+1)) == %dn",*(*(brr+ 1);
直接输出数组第二行的第一个元素,输出的是数字4;
直接访问数组第二行的第一个元素的地址,输出的是4的地址
数组名+1,来到第二行,再+2,来到了第二行的低三个元素,进行一次解应用,则输出的是6的地址。
(7 )printf("*(*brr+1+2) == %dn",*(*(brr+1)+2);
输出数组的第二行第三个元素6;
(10) printf("%dln", brr[1][0]);