C++传递二维数组

原文地址: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;
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值