C++传递二维数组

来源:互联网 发布:java小游戏制作教程 编辑:程序博客网 时间:2024/06/03 18:55

原文地址:http://blog.csdn.net/iamduoluo/article/details/5936763

 

c++之所以强大,其中重要原因之一就是支持指针,然而这也是c++最令人头痛的问题之一,其中二维数组作为参数传递就是其中之一。

一、关于一维数组

C++中一维数组作为函数参数传递应用十分普遍,原理和操作都十分简单。数组名就代表了数组的首地址,下标就是偏移量。函数的形式参数声明为一级指针即可(Type *),而实参就是数组名。

二、扩展到二维数组

一维的情况解决了,接下来扩充到二维的情形。思路同前,采用二级指针引用二维数组(Type**)从而得到如下程序:

#include "stdafx.h"#include<iostream>using namespace std;void test(int m[][15],int i,int j){     for(int a=0;a<i;a++){        for(int b=0;b<j;b++){            m[a][b] = b;        }    }}int print(int m[][15],int i,int j){    for(int a=0;a<i;a++){        for(int b=0;b<j;b++){            cout<<m[a][b]<<",";        }        cout<<endl;    }    return 0;}int _tmain(int argc, _TCHAR* argv[]){    int m[15][15],i,j;    i = 15;j = 15;    test(m,i,j);    print(m,i,j);    return 0;}

 

可是对上边的程序进行编译却会报告错误: 错误 1 error C2664: “test”: 不能将参数 1 从“int [15][15]” 转换为“int **”

呵呵,问题来了吧,不能将这个二维数组转化而二级指针。好,既然这样,那我就把形参声明为二维数组而不是二级指针。对左边函数声明修改如下:

void test(int **m,int i,int j) 改为:

void test(int m[][],int i,int j)

可是这样一来有出现了新的问题: 不能将参数 1 从“int [15][15]” 转换为“int [][1]

原来数组大小匹配不了,于是很容易想到将地二维大小明确给出,而不是缺省值。

void test(int m[][15],int i,int j)

OK 搞定!

 

上面的解决方案虽然解决了燃眉之急,但毕竟不优雅,因为作为函数你必须保证声明了足够大的空间,但是究竟多大才是安全的呢?谁也不知道。下面的解决方案就优雅得多了。

 

#include "stdafx.h"#include<iostream>using namespace std;void test(int **m,int i,int j){     for(int a=0;a<i;a++){        for(int b=0;b<j;b++){            m[a][b] = b;        }    }}int print(int **m,int i,int j){    for(int a=0;a<i;a++){        for(int b=0;b<j;b++){            cout<<m[a][b]<<",";        }        cout<<endl;    }    return 0;}int _tmain(int argc, _TCHAR* argv[]){    int **m,i,j;    i = 15;j = 15;    m = new int*[i];    for(int c=0;c<i;c++)        m[c] = new int[j];    test(m,i,j);    print(m,i,j);    return 0;}


 

0 0
原创粉丝点击