VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1146|回复: 15

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

[复制链接]
79_avatar_middle
在线会员 发表于 2016-2-21 14:45:12 | 显示全部楼层 |阅读模式
最近讨论了一个关于二维数组做为实参传入到函数中,可以定义函数形参的方法,觉得收获挺大,总结如下:
开始时,讨论了几种方法:
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 收起 理由
88_avatar_small 寂寞江湖 + 4 + 4 感谢分享!
16_avatar_small 阳光 + 1 + 1 感谢分享!
28_avatar_small 天下 + 1 + 1 支持原创!
65_avatar_small 编程者 + 2 + 2 支持原创!

查看全部评分





上一篇:C++之stl::string写时拷贝导致的问题
下一篇:一个结构体中的数组可以访问的范围
62_avatar_middle
在线会员 发表于 2016-2-21 20:44:42 | 显示全部楼层
看一看,学一学
06_avatar_middle
在线会员 发表于 2016-2-22 14:32:51 | 显示全部楼层
看一看,学一学
08_avatar_middle
在线会员 发表于 2016-2-22 19:08:48 | 显示全部楼层
二维数组作为函数的实参,定义函数形参的方法
96_avatar_middle
在线会员 发表于 2016-2-23 07:38:41 | 显示全部楼层
学习一下,,看看什么东东
04_avatar_middle
在线会员 发表于 2016-2-23 13:37:36 | 显示全部楼层
正在找这个,谢谢分享!
64_avatar_middle
online_vip 发表于 2016-2-23 17:10:57 | 显示全部楼层
二维数组作为函数的实参,定义函数形参的方法
68_avatar_middle
在线会员 发表于 2016-2-25 14:45:02 | 显示全部楼层
look look
94_avatar_middle
在线会员 发表于 2016-2-26 15:29:00 | 显示全部楼层
前两天刚搞明白...
26_avatar_middle
在线会员 发表于 2016-2-27 14:24:37 | 显示全部楼层
二维数组作为函数的实参,定义函数形参的方法
65_avatar_middle
donate_vip 发表于 2016-3-10 13:47:13 | 显示全部楼层
谢谢分享啊
28_avatar_middle
在线会员 发表于 2016-3-10 13:49:18 | 显示全部楼层
谢谢分享
16_avatar_middle
在线会员 发表于 2016-4-2 16:08:25 | 显示全部楼层

正在学习ing中,
26_avatar_middle
在线会员 发表于 2016-5-22 15:03:10 | 显示全部楼层
新手学习多多指教
32_avatar_middle
online_vip 发表于 2016-5-29 21:39:20 | 显示全部楼层
学习一下
00_avatar_middle
在线会员 发表于 2016-6-29 17:34:05 | 显示全部楼层
打我打我的去阿瓦单位
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-23 22:08

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表