我是Java程序员,我很苦恼这个简单的东西。如何返回这个多维数组?它是否必须返回一个**指针?我怎样才能得到它在另一个文件?返回一个多维数组的指针
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
MoveDirection** get_ghost_moves() {
return ghost_moves;
}
我是Java程序员,我很苦恼这个简单的东西。如何返回这个多维数组?它是否必须返回一个**指针?我怎样才能得到它在另一个文件?返回一个多维数组的指针
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
MoveDirection** get_ghost_moves() {
return ghost_moves;
}
二维数组不是指向指针的指针。在C和C++中,数组和指针是基本不同的类型。一个数组衰变成为一个指向其第一个元素的指针(因此两者之间经常混淆),但它只在第一级衰减:如果你有一个多维数组,它衰变成一个指向数组的指针,而不是指针到一个指针。
的get_ghost_moves
适当声明是将其声明作为指针返回的数组:
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
// Define get_ghost_moves to be a function returning "pointer to array 4 of MoveDirection"
MoveDirection (*get_ghost_moves())[4] {
return ghost_moves;
}
此语法语法是非常混乱的,所以我建议制作一个typedef它:
// Define MoveDirectionArray4 to be an alias for "array of 4 MoveDirections"
typedef MoveDirection MoveDirectionArray4[4];
MoveDirectionArray4 *get_ghost_moves() {
return ghost_moves;
}
ghost_moves
在存储器中占用的一组连续的GHOSTS_SIZE*4
MoveDirections:其相当于一个MoveDirection*
它不能与一个指向指针被使用,但用单一的指针。
如果你想使用两个operator[]
-s索引你的数组你有两个选择:
使用类型的变量:MoveDirection (*ghost_moves) [GHOST_SIZE]
,然后就去做ghost_moves[i][j]
这主要是指针指针,通常不是一个好的解决方案:有ghost_moves
的类型MoveDirection**
例如:
MoveDirection ghost_moves_original[GHOST_SIZE][4];
MoveDirection *ghost_moves[GHOST_SIZE];
ghost_moves[0] = ghost_moves_original;
ghost_moves[1] = ghost_moves_original + GHOST_SIZE;
...
多维数组不是指针数组。它是一个单独的内存块。它只在声明范围内有意义。
你不能干净地返回,因为你在这里..你将不得不返回一个MoveDirection[GHOSTS_SIZE][4]
。
不,只需要一个*即可。关键是要考虑如何将数据排列在内存中:数组只是一系列相同类型的项目,并在内存中连续布局。在这种情况下,数组的形状和大小无关紧要 - 您只是返回一个指向其开头的指针,这意味着您要返回第一个项目的地址。
当然,无论你返回那个指针,都必须知道数组的形状和大小。
关于C和指针的好处之一是,一切都只是一个数字,内存只是一大堆字节。一旦你习惯了这样的想法,这一切都会落到实处。
我相信你想要的以下内容:
MoveDirection (* get_ghost_moves()) [GHOSTS_SIZE][4];
在上面get_ghost_moves
是返回一个指向MoveDirection
阵列阵列的功能,具有尺寸GHOSTS_SIZE
和4
我找到了以下两个网站对于了解如何理解C声明非常有用:
#define MAX 20
char canopy[20][MAX];
typedef char frank[MAX];
frank friend[MAX];
frank *getList()
{
return friend;
}
void test(int n)
{
frank *list = getList();
int i;
for (i = 0; i < 5; i++)
{
printf("list[%d] %s\n\r", i, list[i]);
}
}
int main(void)
{
int i, nf;
for (i = 0; i < 5; i++)
{
snprintf(friend[i], MAX, "test%d", i);
printf("test[%d] %s \n\r", i, friend[i]);
}
test(5);
return 0;
}
事实上,`GHOSTS_SIZE * 4 *的sizeof(MoveDirection)`:) – 2010-12-06 23:09:09
GHOSTS_SIZE * 4个MoveDirections == GHOSTS_SIZE * 4 *的sizeof(MoveDirection)字节 – peoro 2010-12-06 23:09:44