标题:C++中函数怎么返回一个二维数组。指针怎么指向二维数组?
取消只看楼主
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
兄弟我初来咋到,对论坛里很多东西不熟悉,你写的找到了。很感谢。

[[italic] 本帖最后由 VanHorn 于 2008-1-10 14:01 编辑 [/italic]]
2008-01-10 13:57
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
看了你写的帖子之后,我觉得C++中二维以上的数组是个鸡肋。
    一维数组很好,因为指针指向一维数组后可以方便的操作一维数组,而二维数组的指针纯粹就是用来指的,至少我知道函数没法返回二维数组(*)[]指针类型。
    在我30楼的帖子里发生的现象也挺匪夷所思的,直接用二维指针指一个取地址的二维数组首地址不行,而用一个二维指针指一个取地址而返回地址的函数是可以的。总之我觉得,在C++中,在函数不能返回数组的情况下,不能用一维以上相应维数的指针指向相应维数的数组,这是一件很不方便的事。
    三维数组用什么指针指我就更没见过了。
2008-01-10 16:09
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
你是说我在一楼的帖子吗?那只是个示意,我想那样做,可是不行,所以来这里求助。如果函数可以返回有界的二维数组,形式应该怎么写呢?
    刚才我又测试了一下前面楼的代码,发现二维数指针指一个取地址而返回地址的函数是不可以的。例如:
#include <iostream>
using namespace std;
int* f()
{
        int arr[2][3] = {{1,2,3}, {7,8,9}};
        return arr[0];
}

int main()
{
        int **p=NULL,*p1=NULL;
         
        p1=f();//这是可以的。
        p=&(p1);//这是可以的,
        p=&(f());//这是不可以的。这是为什么啊?类型匹配也不能指。

        cout << *p<< endl;
      
        return 0;
}

[[italic] 本帖最后由 VanHorn 于 2008-1-10 17:08 编辑 [/italic]]
2008-01-10 17:07
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
通过和大家的讨论,受益匪浅。再次谢谢大家的热情。
2008-01-10 18:39
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
45,46楼if426的方式很有启发性,你在45楼的思路,在46楼的代码,完全达到了抛砖引玉的效果,非常感谢。
    我详细看了你写的C++代码,你的用意是自定义一个数组类,用这个类的类型来作为函数返回类型。这样就避免了函数返回数组。
    在你的类中,并没有申明二维数组,而是用一个一维结构体数组对二维数组进行了转化,这个结构体的成员分别有代表二维数组的行,列,值。在类的对象申明的时候就用构造函数告诉编译器我要的数组大小,然后动态分配数组。这个做法是很有启发性的。如果让我完善这个类,可能我会重载一下你的那些函数,让它们适合float ,double,char。等。。。
    总之,你的做法对我很有启发。我相信对很多初学者也很有启发,下面我把你的代码加上我理解的注释,和所有C++初学者共勉之。
///////////////////////////
///以下为我加了注释的46楼的代码,
///////////////////////////
//filename: arr2d.h

#ifndef ARR2D_H_
#define ARR2D_H_
#include <iostream>

class Arr2D
{
private:
    int xSize;
    int ySize;
    struct Coor
    {
        int x;//用以储存二维数组行数
        int y;//用以储存二维数组列数
        int v;//用以储存二维数组值。
    };
    Coor* unit;/////在这里申明一个结构体的指针。之后动态分配结构体数组之后,它用于指向动态分配数组的首地址。
public:
    Arr2D();
    Arr2D(int x_size, int y_size);//重载构造函数。(如果多写几个重载构造函数,可以让这个类适合不同的数据类型)
    ~Arr2D();
    void showValue(int x_at, int y_at)const;
    int getValue(int x_at, int y_at)const;
    void setValue(int x_at, int y_at, int v_set_to);
};

#endif

//filename: arr2d.cpp

#include "arr2d.h"

Arr2D::Arr2D()//第一个空构造函数,实际上就是分配一个int内存空间。
{
    xSize = 0;
    ySize = 0;
    Coor* temp = new Coor[0];
    unit = temp;
}

Arr2D::Arr2D(int x_size, int y_size)//动态分配一个以x_size为行数,y_size为列数的二维数组
{                                   //这个二维数组将以一维结构体数组的形式存在于计算机内存中。
    xSize = x_size;
    ySize = y_size;
    int dataSize = xSize * ySize;//算出这个一维结构体数组的大小,大小为二维数组的行数乘以列数。
    Coor* temp = new Coor[dataSize];//以二维数组的行数和列数的乘积做为动态分配结构体数组的大小。
    for (int i = 0; i < xSize; i++){
        for (int j = 0; j < ySize; j++){
            int sn = ySize * i + j;//把二维数组行数,列数转换为一维数组行数。
            temp[sn].v = 0;//分别给结构体成员附上二维数组的行数,列数,以及二维数组的值(初始化为0)。
            temp[sn].x = i;
            temp[sn].y = j;
        }
    }
    unit = temp;//把这个动态分配的数组的首地址附给类的数据成员
}

Arr2D::~Arr2D()
{
    delete [] unit;//对数据成员unit进行销毁。
}

void Arr2D::showValue(int x_at, int y_at)const//显示第x_at行,第y_at列的二维数组的值。
{
    for (int i = 0; i < xSize; i++){
        for (int j = 0; j < ySize; j++){
            int sn = ySize * i + j;
            if ( unit[sn].x == x_at && unit[sn].y == y_at){//遍历一维结构体数组,分别对应结构体数组成员值的行数
//和列数,只要对上了,
//那么结构体成员的值就是在二维数组中所需的行数和列数所对应的值。
                std::cout << "unit[" << unit[sn].x << "," << unit[sn].y
                          << "] = " << unit[sn].v << std::endl;
            }
        }
    }
}

int Arr2D::getValue(int x_at, int y_at)const//返回二维数组第x_at行,第y_at列的值。
{
    for (int i = 0; i < xSize; i++){
        for (int j = 0; j < ySize; j++){
            int sn = ySize * i + j;
            if ( unit[sn].x == x_at && unit[sn].y == y_at){//意义同上
                return unit[sn].v;
            }
        }
    }
    return 0;
}

void Arr2D::setValue(int x_at, int y_at, int v_set_to)
{
    for (int i = 0; i < xSize; i++){
        for (int j = 0; j < ySize; j++){
            int sn = ySize * i + j;
            if ( unit[sn].x == x_at && unit[sn].y == y_at){
//遍历一维结构体数组,分别对应结构体数组成员值的行数
//和列数,只要对上了,
//将所需值附上即可。

                unit[sn].v = v_set_to;
            }
        }
    }
}

//filename: main.cpp
//使用下面语句可创建 X_SIZE * Y_SIZE 的二维数组:
//Arr2D objName ( X_SIZE, Y_SIZE );
//使用下面成员函数将二维数组的x,y位置赋值为A;
//objName.setValue(x,y,A);
//使用下面成员函数可返回二维数组x,y处的值
//objName.getValue(x,y);
//使用下面成员函数可直接显示二维数组x,y处的值
//objName.showValue(x,y);

#include "arr2d.h"

int main(int argc, char* argv[])
{
    int const X_SIZE = 3;
    int const Y_SIZE = 4;
    Arr2D test ( X_SIZE, Y_SIZE );
    for (int i = 0; i < X_SIZE; i++){
        for(int j = 0; j < Y_SIZE; j++){
            test.setValue(i,j,100+Y_SIZE*i+j);//将二维数组中第i行第j列的元素值设置为100+Y_SIZE*i+j
        }
    }
    test.setValue(1,1,200);
    test.setValue(2,2,300);

    for (int i = 0; i < X_SIZE; i++){
        for(int j = 0; j < Y_SIZE; j++){
            test.showValue(i,j);
        }
    }

    int test_get = test.getValue(2,2);//用数组类的成员函数来操作数组,方便了很多,可读性也高了很多。
    std::cout << "test_get = " << test_get << std::endl;

    return 0;
}

[[italic] 本帖最后由 VanHorn 于 2008-1-14 13:53 编辑 [/italic]]
2008-01-14 13:43
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
原帖由 [bold][underline]b629[/underline][/bold] 于 2008-1-12 10:53 发表 [url=http://bbs.][/url]

你去看看老潭的c語言課本,上面有你要的答案。

是论坛的帖子吗?还是就是在这个网站的网页?
2008-01-14 13:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-196439-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.632226 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved