|
最近讨论了一个关于二维数组做为实参传入到函数中,可以定义函数形参的方法,觉得收获挺大,总结如下:
开始时,讨论了几种方法:
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[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[j]<<"\t";
}
cout<<"\n";
}
}
void fun2(int *p) //方法3
{
for (int i=0; i<4; ++i)
{
cout<<p<<"\t";
}
cout<<"\n";
}
void fun3(int **p) //方法4
{
for (int i=0; i<3; ++i)
{
for (int j=0; j<4; ++j)
{
cout<<p[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
现在来说明一下方法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 = new int[col];
}
///////////////////////////////
for (i=0; i<row; ++i)
{
for (int j=0; j<col; ++j)
{
p[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;
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 |
评分
-
参与人数 4 | 驿站币 +8 |
热心值 +8 |
收起
理由
|
寂寞江湖
| + 4 |
+ 4 |
感谢分享! |
阳光
| + 1 |
+ 1 |
感谢分享! |
天下
| + 1 |
+ 1 |
支持原创! |
编程者
| + 2 |
+ 2 |
支持原创! |
查看全部评分
上一篇: C++之stl::string写时拷贝导致的问题下一篇: 一个结构体中的数组可以访问的范围
|