积极答复者
请问在C++中如何将二维数组作为形参,并返回一个二维数组?

问题
-
本人新学C++,在函数和多维数组上面感到很混乱,例如有个函数Func,他的第一个形参是个二维数组,那函数声明应该写成Func(int (*p)[3])这样呢还是写成Func(int p[][3]),又或者写成Func(int **p)这样呢?还有函数返回二维数组的话返回类型应该怎么写呢?我看见有的函数写成double** gauss(double **matrix, int diminsion)这样的,但是我在使用的时候:double a[3][3];gauss(a,3)这样调用总是出错,请教经验丰富的高手详细讲解一下在C++中如何传递二维数组,谢谢
答案
-
你好,
首先, 如何传递二维数组,就像Vonger说的那样,你可以通过a[3*3]来实现,你也可以通过传递数组首地址的方式。
其次,对于返回二维数组,这个是不能直接返回的。因为c++中定义数组,其实是用指针来指向地址来实现其功能的。这个是不同于返回类型:如int,char,*p等等。如何来区分呢,你可以通过看它是否能够在相同类型之间赋值,如:两个数组就不能直接赋值(在native C++里),int a=b 就可以。
如果要实现的话,可以通过一个个的调用地址来输出,来实现返回数组。我给出了一种我实现的方式:
#include "stdafx.h" #include <iostream> using namespace std; int f1(int a[3*3]) { for(int i=0;i!=9;i++) { cout<<a[i]<<endl; } return 0;//该函数返回0,而不是数组中的某个值 } int _tmain(int argc, _TCHAR* argv[]) { int a[][3]={1,2,3,4,5,6,7,8,9}; int n; cout<<f1(*a)<<endl; return 0; }
希望对你有帮助。
- 已建议为答案 Elegentin XieModerator 2012年5月29日 8:43
- 已标记为答案 Elegentin XieModerator 2012年6月12日 7:27
-
不要传递二阶数组.
double a[3][3];gauss(a,3) 我觉得这个应该是声明成gauss(double matrix[3][3], int diminsion) (我没有写代码测试,理论上应该是这样的)
因为你这个指针是常数指针,你不能把它按普通指针传递,如果需要,必须强制转换(不过大部分编译器是禁止这样做的)
需要的话,最好用double a[3*3]这样,然后内部自己去处理数组.
其实,我认为你声明的double a[3][3]也并不是 const double **类型,而是 const double *.
没有写代码测试,仅供参考
0xBAADF00D
- 已编辑 VongerModerator 2012年5月28日 8:31
- 已建议为答案 Elegentin XieModerator 2012年5月29日 7:53
- 已标记为答案 Elegentin XieModerator 2012年6月12日 7:27
-
你好,
欢迎回来!
这次我用的方式是数组指针的方式:
构建了一个函数,返回一个新建好内存的N*N数组,这里数组维数N由你的输入决定;
构建了另一个函数,以上一函数返回的函数指针作为参数,并给这个二维数组赋值。
方式如下:
#include "stdafx.h" #include <iostream> using namespace std; int** dimen(int n) { int **a; a = (int **) malloc (n*sizeof(int*)); for(int i=0; i<n; i++) a[i] = (int *) malloc (n*sizeof(int*)); return a; } int f1(int **a,int n) { for(int i=0; i<n; i++){ for(int j=0; j<n; j++) { a[i][j] = i*n+j; } } return a[n-1][n-1];//返回一个值来测试是否赋值成功,这里我返回的是数组中最后一个元素。 } int _tmain(int argc, _TCHAR* argv[]) { int n; cin>>n; int **a=dimen(n); cout<<f1(a,n)<<endl; free(a); return 0; }
如果有什么不理解的地方,欢迎回复。
- 已建议为答案 Elegentin XieModerator 2012年6月5日 6:26
- 已标记为答案 Elegentin XieModerator 2012年6月12日 7:27
全部回复
-
不要传递二阶数组.
double a[3][3];gauss(a,3) 我觉得这个应该是声明成gauss(double matrix[3][3], int diminsion) (我没有写代码测试,理论上应该是这样的)
因为你这个指针是常数指针,你不能把它按普通指针传递,如果需要,必须强制转换(不过大部分编译器是禁止这样做的)
需要的话,最好用double a[3*3]这样,然后内部自己去处理数组.
其实,我认为你声明的double a[3][3]也并不是 const double **类型,而是 const double *.
没有写代码测试,仅供参考
0xBAADF00D
- 已编辑 VongerModerator 2012年5月28日 8:31
- 已建议为答案 Elegentin XieModerator 2012年5月29日 7:53
- 已标记为答案 Elegentin XieModerator 2012年6月12日 7:27
-
你好,
首先, 如何传递二维数组,就像Vonger说的那样,你可以通过a[3*3]来实现,你也可以通过传递数组首地址的方式。
其次,对于返回二维数组,这个是不能直接返回的。因为c++中定义数组,其实是用指针来指向地址来实现其功能的。这个是不同于返回类型:如int,char,*p等等。如何来区分呢,你可以通过看它是否能够在相同类型之间赋值,如:两个数组就不能直接赋值(在native C++里),int a=b 就可以。
如果要实现的话,可以通过一个个的调用地址来输出,来实现返回数组。我给出了一种我实现的方式:
#include "stdafx.h" #include <iostream> using namespace std; int f1(int a[3*3]) { for(int i=0;i!=9;i++) { cout<<a[i]<<endl; } return 0;//该函数返回0,而不是数组中的某个值 } int _tmain(int argc, _TCHAR* argv[]) { int a[][3]={1,2,3,4,5,6,7,8,9}; int n; cout<<f1(*a)<<endl; return 0; }
希望对你有帮助。
- 已建议为答案 Elegentin XieModerator 2012年5月29日 8:43
- 已标记为答案 Elegentin XieModerator 2012年6月12日 7:27
-
你好,首先感谢您的回答,但是我还是有一点困惑,就是因为我要处理很多与数组有关的问题,因此在函数中需要传递二维数组,例如函数Func(),他的第一个参数就是要传进来一个二维数组,而且传进来的二维数组维数也不知道,有可能是3或者4,如果函数声明写成Func(int[][])这种形式的话,就需要指定第二维的长度,如果声明成为Func(int**),这样的话将数组名传进去,比如Func(a),a是一个二维数组,这样会出错,因为a不是一个int**类型的,所以我现在很困惑如果要向一个函数传递二维数组的话,而且维度也不知道的情况下,函数声明应该写成什么样呢?希望您能够帮我答疑解惑,谢谢。
-
你好,
欢迎回来!
这次我用的方式是数组指针的方式:
构建了一个函数,返回一个新建好内存的N*N数组,这里数组维数N由你的输入决定;
构建了另一个函数,以上一函数返回的函数指针作为参数,并给这个二维数组赋值。
方式如下:
#include "stdafx.h" #include <iostream> using namespace std; int** dimen(int n) { int **a; a = (int **) malloc (n*sizeof(int*)); for(int i=0; i<n; i++) a[i] = (int *) malloc (n*sizeof(int*)); return a; } int f1(int **a,int n) { for(int i=0; i<n; i++){ for(int j=0; j<n; j++) { a[i][j] = i*n+j; } } return a[n-1][n-1];//返回一个值来测试是否赋值成功,这里我返回的是数组中最后一个元素。 } int _tmain(int argc, _TCHAR* argv[]) { int n; cin>>n; int **a=dimen(n); cout<<f1(a,n)<<endl; free(a); return 0; }
如果有什么不理解的地方,欢迎回复。
- 已建议为答案 Elegentin XieModerator 2012年6月5日 6:26
- 已标记为答案 Elegentin XieModerator 2012年6月12日 7:27