gpt4 book ai didi

c - 通过指针访问二维数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:18 25 4
gpt4 key购买 nike

我在尝试访问程序中的 true 二维数组时遇到了一些问题。我有一个模拟二维数组的一维数组来保存一些关卡信息(基于图 block 的游戏)。当我访问某个图 block 时,我会执行常见操作以将行/列索引更改为线性数组:

ma​​p是在堆中分配的,我在level struct中持有指向这个数组的指针

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 二维数组来使代码更具可读性。我有很多依赖于此一维数组的代码,因此我还想保留对 map 的访问表单。

阅读这个网站我发现了如何分配一个二维数组:

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

我在我的结构 (level->map) 中保持指针不变,因为很多代码都需要一维数组,所以我执行以下转换 level->map = (struct _mkTile *)map; 到目前为止,还不错。旧代码可以正常工作。

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

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

最佳答案

是的,您可以将指针转换为一维数组并获得指向二维数组的指针。从分配二维数组时的相同类型开始:

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;

关于c - 通过指针访问二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45949509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com