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; } | |