如何返回存储在类的private
字段中的多维数组?
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**
发布于 2010-09-15 18:21:11
二维数组不会衰减为指向整数指针的指针。它衰减为指向整型数组的指针-也就是说,只有第一维衰减为指针。指针并不指向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();
}
当每个子数组被单独分配时(也就是说,您最初有一个指针数组),就会使用指向指针的指针(int**
)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
这里我们有一个由五个指针组成的数组,每个指针指向一个单独的内存块中的第一项,总共有6个不同的内存块。
在一个二维数组中,你会得到一个连续的内存块:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
你应该看到这些东西的内存布局是完全不同的,因此这些东西不能以相同的方式返回和传递。
发布于 2010-09-15 18:39:52
您可以返回两种可能的类型来提供对内部数组的访问。旧的C风格将返回int *[5]
,因为数组很容易衰减为指向第一个元素的指针,该元素的类型为int[5]
。
int (*foo())[5] {
static int array[5][5] = {};
return array;
}
现在,您还可以返回对内部数组的正确引用,最简单的语法将是通过typedef:
typedef int (&array5x5)[5][5];
array5x5 foo() {
static int array[5][5] = {};
return array;
}
或者,如果没有类型定义函数,就会更加麻烦:
int (&foo())[5][5] {
static int array[5][5] = {};
return array;
}
C++版本的优点是保留了实际类型,这意味着数组的实际大小在调用方是已知的。
发布于 2010-09-15 18:15:26
要返回指向数组成员数组的指针,需要的类型不是int **
,而是int (*)[5]
class Myclass {
private:
int myarray[5][5];
public:
int (*get_array())[5];
};
int (*Myclass::get_array())[5] {
return myarray;
}
https://stackoverflow.com/questions/3716595
复制相似问题