参考原文:
http://blog.csdn.net/u013752202/article/details/49688717
方法一:
通过数组名传递,形参的第一维宽度可以省,但是第二维参数不可以省略。
void f1(int a[][4]) //或者a[3][4],第二维数组不能省。
{
cout << a[1][1]; //5
}
int main()
{
int a[3][4] = { {1,2,3,1},{4,5,6,7},{8,9,10,11} };
f1(a);
}
方法二:
指针传递,将数组第几行的首地址给指针。
void f2(int *p)
{
cout << *p; //4,当p+5后就是第二组的第二个元素
}
int main()
{
int a[3][4] = { {1,2,3,1},{4,5,6,7},{8,9,10,11} };
f2(a[1]); //将第二行的第一个元素的位置给p
}
方法三:
二级指针传递。
void f3(int **p)
{
cout << *((int *)p+5 );
}
int main()
{
int a[3][4] = { {1,2,3,1},{4,5,6,7},{8,9,10,11} };
f3( (int**)a);
while (1);
}
方法四:
这种方法在函数内部可以使用[]符号访问数组元素,但是在调用函数前必须先开辟一段二级指针指向的内存,然后把数组值拷贝到这一块内存中,用完后必须手动释放内存。优点是同一个函数可以接收不同长和宽的二维数组,缺点是必须手动开辟一段内存用完后还要手动回收,并且要把二维数组的值拷贝到开辟的内存中
void print(float **tab,int rows,int cols)
{
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
cout<<tab[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
float ta[2][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};
float **p=new float *[2];//开辟行空间
for(int i=0;i<3;i++)
p[i]=new float[i];//开辟列空间
for(int i=0;i<2;i++){ //赋值
for(int j=0;j<3;j++){
p[i][j]=ta[i][j];
}
}
cout<<"ta: "<<endl;
print(p,2,3);//打印
//p的内存释放方式
for(int i=0;i<3;i++)
delete[]p[i];
delete []p;
}