目录
二维数组的初始化
形式:
数据类型 数组名[整常量表达式][ 整常量表达式]={ 初始化数据 };
初始化方式:
⑴ 分行进行初始化
int a[2][3]={{1,2,3},{4,5,6}};
相当于执行如下语句:
int a[2][3];
a[0][0]=1;a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6;
注意,初始化的数据个数不能超过数组元素的个数,否则出错。
⑵ 不分行的初始化
int a[2][3]={ 1,2,3,4,5,6};
相当于执行如下语句:
a[0][0]=1; a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6;
⑶ 为部分数组元素初始化
static int a[2][3]={{1,2},{4}}; //第一行只有2个初值,按顺序分别赋给a[0][0]和a[0][1];第二行的初值4赋给a[1][0]。由于存储类型是static,故其它数组元素的初值为0。
注意:
1.可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度。
int a[ ][3]={ 1,2,3,4,5,6};
a数组的第一维的定义被省略,初始化数据共6个,第二维的长度为3,即每行3个数,所以a数组的第一维是2。
2.一般,省略第一维的定义时,第一维的大小按如下规则确定:
初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。
例如,int a[ ][3]={ 1,2,3,4};等价于:int a[2][3]={ 1,2,3,4};
若分行初始化,也可以省略第一维的定义。
下列的数组定义中有两对{ },已经表示a数组有两行。static int a[ ][3]={{1,2},{4}};
二维数组作为函数参数
规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。
正确写法:
二维数组作为函数参数正确写法如下所示:
void Func(int array[3][10]);
void Func(int array[ ][10]);
因为数组的行数无关紧要,所以还可以写成如下形式:
void Func(int (*array)[10]); 注意*array需要用括号括起来
因为[]的优先级比*的优先级高,故*array必须用括号括起来,这种形式的声明参数是一个指针,它指向具有10个元素的一维数组。否则变成了void Func(int *array[10]);这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针。
错误写法:
1.void Func(int array[ ][ ]);//如果在形参中不说明列数,则系统无法决定应为多少行多 少列
2.void Func(int array[3][ ]);//实参数组维数可以大于形参数组,例如形参数组定义为:void Func(int array[3][10]); 而实参数组定义为:int array[5][10];
指针写法:
如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,如何解决呢?
编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数。
例如:void Func(int array[3][10]);
void Func(int array[][10]);
变为:void Func(int **array, int m, int n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:*((int*)array + n*i + j);
在调用这样的函数的时候,需要注意一下,如下面的例子:int a[3][3] = {{1,1,1},{2,2,2},{3,3,3}};Func(a, 3, 3);
根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用: Func((int**)a, 3, 3);
转载地址:https://blog.csdn.net/chenshijun0101/article/details/6640377