首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从函数返回多维数组

从函数返回多维数组
EN

Stack Overflow用户
提问于 2010-09-15 18:04:02
回答 7查看 15.6K关注 0票数 24

如何返回存储在类的private字段中的多维数组?

代码语言:javascript
运行
复制
class Myclass {
private:
   int myarray[5][5];
public:
   int **get_array();
};

// This does not work:
int **Myclass::get_array() {
    return myarray;
}

我得到以下错误:

无法将int (*)[5][5]转换为返回

中的int**

EN

回答 7

Stack Overflow用户

发布于 2010-09-15 18:21:11

二维数组不会衰减为指向整数指针的指针。它衰减为指向整型数组的指针-也就是说,只有第一维衰减为指针。指针并不指向int指针,当指针递增时,指针会按指针的大小前进,而是指向5个整数的数组。

代码语言:javascript
运行
复制
class Myclass {
private:
    int myarray[5][5];
public:
    typedef int (*pointer_to_arrays)[5]; //typedefs can make things more readable with such awkward types

    pointer_to_arrays get_array() {return myarray;}
};

int main()
{
    Myclass o;
    int (*a)[5] = o.get_array();
    //or
    Myclass::pointer_to_arrays b = o.get_array();
}

当每个子数组被单独分配时(也就是说,您最初有一个指针数组),就会使用指向指针的指针(int**)

代码语言:javascript
运行
复制
int* p[5];
for (int i = 0; i != 5; ++i) {
    p[i] = new int[5];
}

这里我们有一个由五个指针组成的数组,每个指针指向一个单独的内存块中的第一项,总共有6个不同的内存块。

在一个二维数组中,你会得到一个连续的内存块:

代码语言:javascript
运行
复制
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes

你应该看到这些东西的内存布局是完全不同的,因此这些东西不能以相同的方式返回和传递。

票数 27
EN

Stack Overflow用户

发布于 2010-09-15 18:39:52

您可以返回两种可能的类型来提供对内部数组的访问。旧的C风格将返回int *[5],因为数组很容易衰减为指向第一个元素的指针,该元素的类型为int[5]

代码语言:javascript
运行
复制
int (*foo())[5] {
   static int array[5][5] = {};
   return array;
}

现在,您还可以返回对内部数组的正确引用,最简单的语法将是通过typedef:

代码语言:javascript
运行
复制
typedef int (&array5x5)[5][5];
array5x5 foo() {
   static int array[5][5] = {};
   return array;
}

或者,如果没有类型定义函数,就会更加麻烦:

代码语言:javascript
运行
复制
int (&foo())[5][5] {
   static int array[5][5] = {};
   return array;
}

C++版本的优点是保留了实际类型,这意味着数组的实际大小在调用方是已知的。

票数 18
EN

Stack Overflow用户

发布于 2010-09-15 18:15:26

要返回指向数组成员数组的指针,需要的类型不是int **,而是int (*)[5]

代码语言:javascript
运行
复制
class Myclass {
private:
    int myarray[5][5];
public:
    int (*get_array())[5];
};

int (*Myclass::get_array())[5] {
    return myarray;
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3716595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档