通过指针访问2D数组

时间:2017-08-29 23:02:48

标签: c arrays c99

我在尝试访问程序中的 true 2D数组时遇到了一些问题。 我有一个1D数组模拟2D数组来保存一些级别信息(基于区块的游戏)。当我访问某个磁贴时,我执行常见操作以将行/列索引更改为liniar数组:

地图是在堆中分配的,我在关卡结构中保存了一个指向此数组的指针

size = x * y;
level->map = malloc(size * sizeof(struct _mkTile));
[...]
for (size_t i = 0; i < level->y; i++) {
    for (size_t e = 0; e < level->x; e++) {
        level->map[i * level->y + e].pos.x = xpos;
        [...]

我在代码中多次执行此操作,但最近我想使用 true 2D数组来使代码更具可读性。我有很多代码依赖于这个1D数组,所以我也希望将这个访问表单保存到地图中。

阅读本网站,我发现了如何分配2D数组:

struct _mkTile(*map)[x] = malloc(sizeof(struct _mkTile[x][y]));

我将指针保存在我的struct(level-&gt; map)中是相同的,因为很多代码都期望一维数组,所以我执行以下转换level->map = (struct _mkTile *)map;到目前为止,非常好。旧代码没有问题。

此时我可以使用map[i][e]指针通过2D索引访问我的图块,但不是level->map

所以问题是,如何正确声明指向2D数组(具有未知大小)的指针,允许使用2D访问器[][]?是否可以将level->map指针强制转换为 true 2D数组?

2 个答案:

答案 0 :(得分:1)

是的,您可以将指针强制转换为1D数组并获取指向2D数组的指针。以与分配2D阵列时相同的类型开始:

struct _mkTile(*map2d)[x] = level->map; // type mismatch, see compiler error

添加演员:

struct _mkTile(*map2d)[x] = (struct _mkTile(*)[x])level->map;

最后,使用typedef清理它:

typedef struct _mkTile row_t[x];
row_t* map2d = (row_t*)level->map;

答案 1 :(得分:0)

for循环中,您在level-&gt;地图中指定值,索引看起来不对。尝试:

 level->map[i * level->x + e].pos.x = xpos;

它是i * level->x + e,因为每行i都有level-&gt; x数据,而不是level-&gt; y。