做 图的m--着色问题 的时候,在“二维数组作为参数传递给函数”的问题上果断阵亡(原先一直没怎么用过二维数组做参数传递),上网查了些资料,嘿嘿,搞清楚了,好好总结了下:
问题描述:当二维数组作为参数传递给函数时,函数的形参不能简单地写双重指针,因为编译器实际寻址如下:对于数组 int p[m][n];如果要取p[i][j]的值,编译器是这样寻址的:p + i*n + j; 如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。因此如果我们在编写程序的时候需要用到各个维数都不固定的二维数组作为参数,虽然这个时候编译器还是不能识别,但我们可以把二维数组当做普通的指针,将它的大小用两个参数指明,然后我们为二维数组手工寻址,这样就可以将二维数组作为函数的参数传递了,我们可以把维数固定的参数变为维数随即的参数,如:
void Func(int array[3][10]);
void Func(int array[][10]);
变为:
void Func(int **array, int m, int n);
在转变后的函数中,要用到array[i][j],如果直接这样使用,我在vc6.0上编译、连接的时候都不会报错,但运行的时候会出错,因为根据编译器的寻址方式,需要知道维数(编译器寻址方式p + i*n + j;中的n),所以不能正确寻址,因此需要将array[i][j]这样的式子手工转变为
*((int*)array + n*i + j); //array前必须加(int *),强制转换成指针
另外要补充的是,在函数调用时,需要如下强制转换二维数组a:(不然的话,根据不同编译器不同的设置,可能出现warning 或者error)
Func((int**)a, 3, 3);
总结完毕,hoho~~,小知识,大收获....