返回多维数组的指针

4

我是一名Java程序员,我正在为这个简单的问题苦苦挣扎。

如何返回这个多维数组?它必须返回一个指针吗?我该如何在另一个文件中获取它?

static MoveDirection ghost_moves[GHOSTS_SIZE][4];

MoveDirection** get_ghost_moves() {
    return ghost_moves;
}
6个回答

5
一个二维数组并不是指向指针的指针。在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;
}

3
#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;
}

2
欢迎来到 Stack Overflow!也许您想对代码进行一些评论,并解释它是如何工作的? - blue112

3
我相信您想要以下内容:
MoveDirection ( * get_ghost_moves() ) [GHOSTS_SIZE][4];

在上面的代码中,get_ghost_moves是一个返回指向MoveDirection数组的指针的函数,其维度为GHOSTS_SIZE和4个数组。
我发现以下两个网站非常有用,可以帮助理解C语言声明:

2
不需要,只用一个星号就可以了。关键是要思考你的数据在内存中是如何排列的:数组只是一系列相同类型的项,在内存中连续排列。在这种情况下,数组的形状和大小并不重要 - 你只是返回指向它开头的指针,这意味着你返回的是第一项的地址。
当然,你将这个指针返回给谁,他们必须知道数组的形状和大小。
C和指针的好处之一是,一切都只是一个数字,而内存只是一个巨大的字节数组。一旦你习惯了这样的思考方式,一切就会水到渠成。

0

ghost_moves 占据了一段连续的 GHOSTS_SIZE*4 个 MoveDirections 的内存空间:它相当于一个 MoveDirection*

它不能与指向指针的指针一起使用,而是需要单独使用一个指针。


如果你想使用两个operator[]来索引你的数组,你有两个选择:

  1. 使用类型为MoveDirection (*ghost_moves) [GHOST_SIZE]的变量,然后只需执行ghost_moves[i][j]

  2. 这主要是为了拥有指向指针的指针,通常不是一个好的解决方案:将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;
    ...
    

1
实际上是 GHOSTS_SIZE*4*sizeof(MoveDirection) :) - Billy ONeal
GHOSTS_SIZE4个MoveDirections等于GHOSTS_SIZE4*sizeof(MoveDirection)字节。 - peoro

0

多维数组不是指针数组。它是一个单一的内存块。它只在声明它的作用域内有意义。

你不能像这样干净地返回它.. 你必须返回一个 MoveDirection[GHOSTS_SIZE][4]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接