今天写个小程序,发现对二维数组作为函数参数传递的情况不够清楚,故写测试程序如下。(基本功很重要,还远远不够扎实啊,难过)
refer:参数传递二维数组
#include <iostream>
using namespace std;
//数组名形式,第一维可省,第二维必须有,否则无法通过编译
void func1( int arr[][3], int nRows, int nCols ){
for ( int i=0; i<nRows; ++i){
for ( int j=0; j<nCols; ++j ){
cout<<arr[i][j];
}
cout<<endl;
}
cout<<"func1 is done";
}
//二维数组引用形式,必须同时指定一二维大小
void func2( int (&arr)[2][3], int nRows, int nCols ){
for ( int i=0; i<nRows; ++i){
for ( int j=0; j<nCols; ++j ){
cout<<arr[i][j];
}
cout<<endl;
}
cout<<"func2 is done";
}
//二维数组指针形式,必须同时指定一二维大小
void func3( int (*arr)[2][3], int nRows, int nCols ){
for ( int i=0; i<nRows; ++i){
for ( int j=0; j<nCols; ++j ){
cout<<(*arr)[i][j]; //先对指针解引用,再当做数组名用
}
cout<<endl;
}
cout<<"func3 is done";
}
//数组指针作为形参,本质是指向第二维数组的指针,故必须指定二维大小;否则编译通过,但无法调用
void func4( int (*arr)[3], int nRows, int nCols ){
for ( int i=0; i<nRows; ++i){
for ( int j=0; j<nCols; ++j ){
cout<<arr[i][j];
}
cout<<endl;
}
cout<<"func4 is done";
}
//指针形式,调用本函数时,实参要转换为对应指针类型再来调用;无论几维,都看作指针
void func5( int *arr, int nRows, int nCols ){
for ( int i=0; i<nRows; ++i){
for ( int j=0; j<nCols; ++j ){
cout<<*(arr+i*i+j); //注意这里!先寻址再解引用
}
cout<<endl;
}
cout<<"func5 is done";
}
//多重指针形式,调用本函数时,实参本质不应该是数组,而是指针,即数组是动态生成的
void func6( int **arr, int nRows, int nCols ){
for ( int i=0; i<nRows; ++i){
for ( int j=0; j<nCols; ++j ){
cout<<arr[i][j]; //注意这里!先寻址再解引用
}
cout<<endl;
}
cout<<"func6 is done";
}
//对一维数组来说,可以直接用数组名为实参、一重指针为形参来调用
void _1Dfunc( int *arr, int len ){
for ( int i=0; i<len; ++i){
cout<<arr[i];
}
cout<<endl;
cout<<"_1Dfunc is done";
}
int main(){
//int arr[3][3] = {0};
//for ( int i=0; i<3; ++i){
// for ( int j=0; j<3; ++j ){
// arr[i][j] = i*j+j;
// }
//}
int arr[2][3]={{1,2,3},{4,5,6}};
func1(arr, 2, 3);
cout<<endl;
func2(arr, 2, 3);
cout<<endl;
func3(&arr, 2, 3); //调的是二维数组指针形式,用地址为实参
cout<<endl;
func4(arr, 2, 3);
cout<<endl;
//func5 不知是否足够合理,可通过,但暂时少用
func5((int *)arr, 2, 3); //arr是二维数组名,强制转换;arr本身是指向数组的指针,这里转换为int指针;
cout<<endl;
int nRows = 2, nCols = 3;
int **arr2 = new int*[nRows];
for ( int i=0; i<nRows; ++i ){
arr2[i] = new int[nCols];
for ( int j=0; j<nCols; ++j ){
arr2[i][j] = i*nCols+j+1;
}
}
func6(arr2, 2, 3);
cout<<endl;
int arr1D[3] = {1,2,3};
_1Dfunc(arr1D,3);
cout<<endl;
system("pause");
return 0;
}