【问题标题】:Cell indexing in a 2D pointer array二维指针数组中的单元格索引
【发布时间】:2017-04-03 15:02:23
【问题描述】:

对于学校,我正在做一个项目,我必须使用指针保存地图。该地图由“单元”结构组成。初始化地图时,我想使用函数 index_map 来返回单元格的地址,以便我可以更改它的属性。但是,当我尝试编译此代码时,会发生以下错误:

警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types] placeInMap = &(w->map) + stepxx + stepyy;

这是我的 index_map 函数:

`cell* index_map(worldmap* w, int x, int y) 
{
    cell* cellInMap;
    size_t stepx = sizeof(cell)*w->cols;
    size_t stepy = sizeof(cell);
    cellInMap = &(w->map) + stepx*x + stepy*y;
    return cellInMap;
}*`

Worldmap 是一个结构体,定义为:

`typedef struct worldmap
{
  cell* map;
  unsigned int rows;
  unsigned int cols;
} worldmap;`

Cell 是一个结构体,定义为:

`typedef struct cell
{
    celltype type;
    unsigned int owner;
}cell;`

【问题讨论】:

  • 您的代码中没有二维数组。为什么在标题中提到一个?

标签: c arrays pointers


【解决方案1】:

w->mapcell *。 C 中的指针算法已经考虑了数组元素的大小,因此要获得cell x y 的地址,只需将行索引乘以列数和列索引:

cellInMap = w->map + x*w->col + y;

出现警告是因为您使用了&(w.map),这是一个cell ** 分配给cell *,因此具有不同的索引级别。

【讨论】:

    【解决方案2】:

    w->map 的类型为 cell*

    &(w->map) 的类型为 cell**(指向单元格指针的指针)

    您正在添加到 cell** 指针,它会产生一个 cell** 指针。然后,您尝试将其分配给 cellInMap ,它是一个 cell* 指针。这些是不同的,你会得到错误。

    如果将 X 添加到指针,它会按指针指向的大小前进。因此,如果您直接添加到 w->map 而不是尝试添加到 &(w->map),您似乎有额外的逻辑来获取您可能不需要的 sizeof(cell)。我觉得你想多了这个问题!

    【讨论】:

    • @SRots 如果您同意某个答案,那么在本网站上进行的方式就是对其进行投票。点击答案左上角的向上箭头。
    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2021-12-17
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多