2D指针数组中的单元索引

时间:2017-04-03 15:02:24

标签: c arrays pointers

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

警告:从不兼容的指针类型分配[-Wincompatible-pointer-types]      placeInMap =&(w-> map)+ stepx x + stepy y;

这是我的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;`

2 个答案:

答案 0 :(得分:0)

w-> map有type cell *

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

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

如果将X添加到指针,它将按指针指向的大小前进。所以,如果你直接添加到w-> map而不是尝试添加到&(w-> map),你似乎有额外的逻辑来获得你可能不需要的sizeof(cell)。我认为你是在思考这个问题!

答案 1 :(得分:0)

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

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

警告就在那里,因为您使用&(w.map) cell **分配给cell *,因此使用不同的索引级别。