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