您的位置:首页 > 其它

二维数组作为函数的实参,定义函数形参的方法

2013-01-04 20:42 309 查看
最近讨论了一个关于二维数组做为实参传入到函数中,可以定义函数形参的方法,觉得收获挺大,总结如下:开始时,讨论了几种方法:1、直接用二维数组的形式,如:int array[3][4]。2、用指向数组的指针,如:int (*p)[4]。3、形参采用指针,如int *p,而在主函数里进行特殊操作,使二维数组传值到函数里。4、用指向指针的指针,如:int **p。先说明这种方法是错的,分析在后面。哈哈~~~~代码:#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**}正确的输出结果为:0 1 2 34 5 6 78 9 10 11 //前三行,方法1的输出0 1 2 34 5 6 78 9 10 11 //中间三行,方法2的输出0 1 2 34 5 6 78 9 10 11 //后三行,方法3的输出Press any key to continue现在来说明一下方法4的错误,可以输出a和a[0]的地址(cout<<a<<a[0];),它们的值是相同的,也就是说二维数组不能用指向指针的指针来描述。当然我们可以使用动态创建数组,这样我们就可以使用方法4来定义二维数组的形参,代码如下: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=00382DF0p[0]=00382E28 //p和p[0]的值不同b=0012FF44b[0]=0012FF44 //b和b[0]的值相同,//但不是等价的,b代表的是b[0]的地址,而b[0]代表的是b[0][0]的地址0 1 2 30 2 4 60 3 6 9 //用方法4输出的结果delete p[0] //删除申请的空间delete p[1]delete p[2]delete pPress any key to continue
二维数组只能作为 连续内存单个指针来指定,而动态配的可以解决函数参数问题
原文链接:http://blog.sina.com.cn/s/blog_644949120100se70.html
这篇文章是转载的,在这里做一下修改,博主说的fun3(a)编译会出现错误,但是 根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换调用,可以修改为fun3((int**)a),有可能会出现强制转换导致地址访问错误;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: