最近讨论了一个关于二维数组作为实参传入到函数中,能够定义函数形参的方法,以为收获挺大,总结以下:ios
开始时,讨论了几种方法:数组
一、直接用二维数组的形式,如:int array[3][4]。ide
二、用指向数组的指针,如:int (*p)[4]。函数
三、形参采用指针,如int *p,而在主函数里进行特殊操做,使二维数组传值到函数里。this
四、用指向指针的指针,如:int **p。先说明这种方法是错的,分析在后面。哈哈~~~~spa
代码:指针
- #include <iostream>
- using namespace std;
- void fun(int a[3][4]) //方法1
- {
- for (int i=0; i<3; ++i)
- {
- for (int j=0; j<4; ++j)
- {
- cout<<a[i][j]<<"\t";
- }
- cout<<"\n";
- }
- }
- void fun1(int (*p)[4]) //方法2
- {
- for (int i=0; i<3; ++i)
- {
- for (int j=0; j<4; ++j)
- {
- cout<<p[i][j]<<"\t";
- }
- cout<<"\n";
- }
- }
- void fun2(int *p) //方法3
- {
- for (int i=0; i<4; ++i)
- {
- cout<<p[i]<<"\t";
- }
- cout<<"\n";
- }
- void fun3(int **p) //方法4
- {
- for (int i=0; i<3; ++i)
- {
- for (int j=0; j<4; ++j)
- {
- cout<<p[i][j]<<"\t";
- }
- cout<<"\n";
- }
- }
- void main()
- {
- int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
- fun(a);
- fun1(a);
- for (int i=0; i<3; ++i)
- {
- fun2(*(a+i));
- }
- fun3(a); //编译发生错误,int [][]不能转化为int**
- }
正确的输出结果为: string
- 0 1 2 3
- 4 5 6 7
- 8 9 10 11 //前三行,方法1的输出
- 0 1 2 3
- 4 5 6 7
- 8 9 10 11 //中间三行,方法2的输出
- 0 1 2 3
- 4 5 6 7
- 8 9 10 11 //后三行,方法3的输出
- Press any key to continue
如今来讲明一下方法4的错误,能够输出a和a[0]的地址(cout<<a<<a[0];),它们的值是相同的,也就是说二维数组不能用指向指针的指针来描述。it
固然咱们可使用动态建立数组,这样咱们就可使用方法4来定义二维数组的形参,代码以下:io
- int row = 3;
- int col = 4;
- //////////////////////////////
- //建立动态二维数组
- int **p = new int*[row];
- for (int i=0; i<row; ++i)
- {
- p[i] = new int[col];
- }
- ///////////////////////////////
- for (i=0; i<row; ++i)
- {
- for (int j=0; j<col; ++j)
- {
- p[i][j] = i*j+j; //赋值
- }
- }
- cout<<"p="<<p<<"\n"<<"p[0]="<<p[0]<<"\n";//输出p和p[0]的值
- int b[2][5] = {0};
- cout<<"b="<<b<<"\n"<<"b[0]="<<b[0]<<"\n";//输出b和b[0]的值
- fun3(p);
- /////////////////////////////////////////////
- //记得要删除本身申请的空间
- for (i=0; i<row; ++i)
- {
- delete[] p[i];
- cout<<"delete p["<<i<<"]\n";
- }
- delete []p;
- cout<<"delete p\n";
- /////////////////////////////////////////////
输出结果为:
- p=00382DF0
- p[0]=00382E28 //p和p[0]的值不一样
- b=0012FF44
- b[0]=0012FF44 //b和b[0]的值相同,
- //但不是等价的,b表明的是b[0]的地址,而b[0]表明的是b[0][0]的地址
- 0 1 2 3
- 0 2 4 6
- 0 3 6 9 //用方法4输出的结果
- delete p[0] //删除申请的空间
- delete p[1]
- delete p[2]
- delete p
- Press any key to continue