【问题标题】:How to write a 2d-array C++ function-parameter (eg. for int[x][y])?如何编写二维数组 C++ 函数参数(例如 int[x][y])?
【发布时间】:2015-01-10 21:36:06
【问题描述】:

我有一个二维数组

int tilemap[800][600];

我想在函数中使用这样的 Araay(作为参数)

void load(int* tiles);

但数据类型int* 不是正确的。

什么是正确的?我不知道。

谢谢!

【问题讨论】:

  • void load(int tiles[800][600]); ?
  • void load(int **tiles) 可能是您正在寻找的那个。但是向量会更好
  • 别工作! no known conversion for argument 3 from ‘int (*)[40][30]’ to ‘int**’
  • 那是一个函数指针
  • @EdHeal 不,这是完全错误的。指针数组与数组数组不兼容。

标签: c++ arrays int


【解决方案1】:
void load(int tiles[][600]);

您可以通过两种方式获得矩阵。一种是使用指向数据数组的指针(行)数组的指针。

其他方式是您选择的方式。 遗憾的是,它是一个二维数组,这意味着(在 c/c++ 的情况下)数据行在内存中是一个在另一个之后。 这个矩阵:

 +-------+
 | 7 | 9 |
 +-------+
 | 5 | 2 |
 +-------+

在内存中是这样表示的:

[ [7] [9] ] [ [5] [2] ]

要获取位置 [1][0] 处的元素,计算机需要根据矩阵的地址(它的第一个元素的地址)和位置编号来计算它的地址。 在上面的示例中,您看到 [1][0] 的地址是(数字 7 的地址)+ 2*sizeof(int),即 &matrix + 2。 所以计算元素[i][j]地址的实际公式是

&matrix + (number_of_columns*i + j)

我省略了 *sizeof(int) 或 *sizeof(type) 因为包含指针和整数的算术已经包含了它,但是如果 &matrix 是某些数据的原始地址,在不知道它的类型的情况下应该包含它。 这就是机器指令级别发生的事情,计算机计算

 address_of_matrix + (number_of_columns*i + j)*sizeof(type)

所以你至少需要告诉编译器这个矩阵有多少列。 当然,您还需要行数,但这是您需要的,而不是编译器。

我希望它更清楚。在这里很难解释。但是网上的资料很多。

【讨论】:

    【解决方案2】:

    int* 的数据类型不正确。

    其实还好。数组数组的所有元素都按顺序存储,因此指向第一个的指针就足以找到所有其他元素。

    不过,“最佳”选项是对数组的引用,因为这样会保留大小信息:

    template<size_t M, size_t N>
    void load(int (&tiles)[M][N])
    {
    }
    

    (请注意,与所有模板一样,定义应该在实例化时可见)

    如果第二个范围始终是固定的,您可以将 array-of-array 作为指向数组的指针传递,因为 array-of-T 始终可以作为指向-T 的指针传递:

    void load(int (*tiles)[600])
    {
    }
    

    这就是 Marko 和 2501 的示例代码正在做的事情,尽管他们使用了一种看起来像数组的误导性语法,而实际上它是一个指针。

    【讨论】:

    • 我只是想说编译器需要知道有多少列,以及为什么。好的,这不是声明它的最佳方式,但效果相同。
    • @Marko:您的代码是正确的,尽管它看起来像一个数组,但它不是。我没有投反对票。
    • 我同意。还应该告诉 void f(int array[]);并不是真正接受数组。也就是说,它不是复制数组以将其传递给函数,而实际上只是传递指针,就像 void f(int* array);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2018-10-09
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多