从函数返回多维数组

jus*_*tin 21 c++ multidimensional-array

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

class Myclass {
private:
   int myarray[5][5];
public:
   int **get_array();
};

// This does not work:
int **Myclass::get_array() {
    return myarray;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

无法转换int (*)[5][5]int**回报

vis*_*tor 24

二维数组不会衰减到指向int的指针.它衰减到指向int数组的指针 - 也就是说,只有第一个维度衰减到指针.指针不指向int指针,当指针增加时,指针的大小增加,而指向5个整数的数组.

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();
}
Run Code Online (Sandbox Code Playgroud)

int**当单独分配每个子数组时(即,您最初有一个指针数组),使用指向pointer()的指针

int* p[5];
for (int i = 0; i != 5; ++i) {
    p[i] = new int[5];
}
Run Code Online (Sandbox Code Playgroud)

这里我们有一个包含五个指针的数组,每个指针指向一个单独的内存块中的第一个项目,共有6个不同的内存块.

在二维数组中,您将获得一个连续的内存块:

int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*eas 18

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

int (*foo())[5] {
   static int array[5][5] = {};
   return array;
}
Run Code Online (Sandbox Code Playgroud)

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

typedef int (&array5x5)[5][5];
array5x5 foo() {
   static int array[5][5] = {};
   return array;
}
Run Code Online (Sandbox Code Playgroud)

或者没有typedef更麻烦:

int (&foo())[5][5] {
   static int array[5][5] = {};
   return array;
}
Run Code Online (Sandbox Code Playgroud)

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


CB *_*ley 7

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

class Myclass {
private:
    int myarray[5][5];
public:
    int (*get_array())[5];
};

int (*Myclass::get_array())[5] {
    return myarray;
}
Run Code Online (Sandbox Code Playgroud)