最近讨论了一个关于二维数组做为实参传入到函数中,可以定义函数形参的方法,觉得收获挺大,总结如下:
开始时,讨论了几种方法:
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 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
- 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
- p=00382DF0
二维数组只能作为 连续内存单个指针来指定,而动态配的可以解决函数参数问题
原文链接:http://blog.sina.com.cn/s/blog_644949120100se70.html
这篇文章是转载的,在这里做一下修改,博主说的fun3(a)编译会出现错误,但是根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换调用,可以修改为fun3((int**)a),
有可能会出现强制转换导致地址访问错误
;