频道栏目
首页 > 程序开发 > 软件开发 > C++ > 正文
C++ 指针 多维数组传递参数
2013-10-29 13:54:39      个评论      
收藏   我要投稿
数组作为函数参数,其实就是把其第一个元素地址传递给函数。

而多维数组一般都非常困惑我们,解决好多维数组参数传递也有多种实现方法,但是我觉得还是以The C++ Programming Language这本书为标准,看看如何做吧。

C++之父的建议就是不要使用数组传递参数,而是把数组用类包起来,使用STL如:array, string,vector等。如果坚持要直接使用一般数组的话,会要应付各种隐晦的bug和令人困惑的因素。

如下是一般的传递参数方法。但是一般我们并不确定数组的维数,那怎么办呢?

[cpp]  

void print_m35(int m[3][5])  

{  

    for (int i = 0; i!=3; i++) {  

    for (int j = 0; j!=5; j++)  

    cout << m[i][j] << '\t';  

    cout << '\n';  

    }  

}  

第一维是和定位元素(本例中是3)无关的,只是告诉我们有多少个元素(本例中是int[5], 而不是int)在数组里面。

所以可以不确定第一维,如下:

[cpp]  

void print_mi5(int m[][5], int dim1)  

{  

for (int i = 0; i!=dim1; i++) {  

for (int j = 0; j!=5; j++)  

cout << m[i][j] << '\t';  

cout << '\n';  

}  

}  

但是还不能达到我们的要求。我们的本能反应就是如下写程序:

[cpp]  

void print_mij(int m[][], int dim1, int dim2) // doesn’t behave as most people would think  

{  

    for (int i = 0; i!=dim1; i++) {  

    for (int j = 0; j!=dim2; j++)  

    cout << m[i][j] << '\t'; // surprise!  

    cout << '\n';  

    }  

}  

可是这确是错误的。因为m[][]非法,第二维必须让编译器知道,以定位元素。

正确的做法应该是:

[cpp]  

void print_mij(int* m, int dim1, int dim2)  

{  

    for (int i = 0; i!=dim1; i++) {  

    for (int j = 0; j!=dim2; j++)  

    cout << m[i*dim2+j] << '\t'; // obscure  

    cout << '\n';  

    }  

}  

调用函数如下:

[cpp]  

int test()  

{  

    int v[3][5] = {  

    {0,1,2,3,4}, {10,11,12,13,14}, {20,21,22,23,24}  

    };    

    print_m35(v);  

    print_mi5(v,3);  

    print_mij(&v[0][0],3,5);  

}  

 

最后一个语句也可以只用v[0]代替&v[0][0],因为两者是一样的, 但是不能使用v,这是类型错误了。

最后还是建议用类封装起来,使用vector等容器。

点击复制链接 与好友分享!回本站首页
上一篇:UVa 10785 - The Mad Numerologist
下一篇:(字符串的处理4.7.16)POJ 1159 Palindrome(让一个字符串变成回文串需要插入多少个字符...先逆序,在减去公共子序列的最大长度即可
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站