返回多维数组的指针

时间:2010-12-06 23:04:32

标签: c pointers

我是Java程序员,我正在努力解决这些简单的事情。

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

static MoveDirection ghost_moves[GHOSTS_SIZE][4];

MoveDirection** get_ghost_moves() {
    return ghost_moves;
}

5 个答案:

答案 0 :(得分:5)

2D数组不是指向指针的指针。数组和指针在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;
}

答案 1 :(得分:3)

我相信你想要以下内容:

MoveDirection ( * get_ghost_moves() ) [GHOSTS_SIZE][4];

在上面get_ghost_moves是一个函数,它返回一个指向MoveDirection数组数组的指针,其中维度为GHOSTS_SIZE和4。

我发现以下两个网站对学习如何理解C声明非常有用:

答案 2 :(得分:2)

不,只需要一个*即可。关键是要考虑数据在内存中的排列方式:数组只是一系列相同类型的项目,在内存中连续排列。在这种情况下,数组的形状或大小并不重要 - 您只是返回一个指向它开头的指针,这意味着您将返回第一个项目的地址。

当然,无论你返回指针的是谁,都必须知道数组的形状和大小。

关于C和指针的一个好处是,一切都只是一个数字,而内存只是一个很大的字节数组。一旦你这样思考就会感到舒服,这一切都会落到实处。

答案 3 :(得分:0)

ghost_moves在内存中占用一组连续的GHOSTS_SIZE*4 MoveDirections:相当于MoveDirection*

它不能与指针指针一起使用,而是使用单个指针。


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

  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;
    ...
    

答案 4 :(得分:0)

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

你不能像在这里那样干净利落地返回..你必须返回MoveDirection[GHOSTS_SIZE][4]