none
请问在C++中如何将二维数组作为形参,并返回一个二维数组? RRS feed

  • 问题

  • 本人新学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++中如何传递二维数组,谢谢
    2012年5月28日 6:55

答案

  •       你好,

          首先, 如何传递二维数组,就像Vonger说的那样,你可以通过a[3*3]来实现,你也可以通过传递数组首地址的方式。

        其次,对于返回二维数组,这个是不能直接返回的。因为c++中定义数组,其实是用指针来指向地址来实现其功能的。这个是不同于返回类型:如intchar*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;
    }
    

       希望对你有帮助。

    2012年5月29日 8:42
    版主
  • 不要传递二阶数组.

    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


    2012年5月28日 8:31
    版主
  • 你好,

    欢迎回来!

    这次我用的方式是数组指针的方式:

    构建了一个函数,返回一个新建好内存的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;
    }
    

    如果有什么不理解的地方,欢迎回复。

    2012年6月4日 7:06
    版主

全部回复

  • 不要传递二阶数组.

    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


    2012年5月28日 8:31
    版主
  •       你好,

          首先, 如何传递二维数组,就像Vonger说的那样,你可以通过a[3*3]来实现,你也可以通过传递数组首地址的方式。

        其次,对于返回二维数组,这个是不能直接返回的。因为c++中定义数组,其实是用指针来指向地址来实现其功能的。这个是不同于返回类型:如intchar*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;
    }
    

       希望对你有帮助。

    2012年5月29日 8:42
    版主
  • 你好,首先感谢您的回答,但是我还是有一点困惑,就是因为我要处理很多与数组有关的问题,因此在函数中需要传递二维数组,例如函数Func(),他的第一个参数就是要传进来一个二维数组,而且传进来的二维数组维数也不知道,有可能是3或者4,如果函数声明写成Func(int[][])这种形式的话,就需要指定第二维的长度,如果声明成为Func(int**),这样的话将数组名传进去,比如Func(a),a是一个二维数组,这样会出错,因为a不是一个int**类型的,所以我现在很困惑如果要向一个函数传递二维数组的话,而且维度也不知道的情况下,函数声明应该写成什么样呢?希望您能够帮我答疑解惑,谢谢。
    2012年6月1日 8:40
  • 你好,

    欢迎回来!

    这次我用的方式是数组指针的方式:

    构建了一个函数,返回一个新建好内存的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;
    }
    

    如果有什么不理解的地方,欢迎回复。

    2012年6月4日 7:06
    版主