如何在C中返回多维数组元素的索引?

时间:2010-04-09 15:40:20

标签: c arrays pointers indexing multidimensional-array

假设我有一个随机布尔值的二维数组和一个名为“网格”的零,我有一个名为“list”的一维数组,它列出了二维数组中所有零的地址。这是数组的定义方式:

define n 100  
bool lattice[n][n];  
bool *list[n*n];

用1和0填充晶格后,我将列的地址存储在列表中:

for(j = 0; j < n; j++)
{   
    for(i = 0; i < n; i++)
    {
        if(!lattice[i][j])  // if element = 0
        {
            list[site_num] = &lattice[i][j];  // store address of zero
            site_num++;
        }
    }
}

如何提取数组中每个零点的x,y坐标?换句话说,有没有办法通过引用它的地址来返回数组元素的索引?

编辑:我需要尽可能提高代码的效率,因为我正在做很多其他复杂的事情和更大的数组。因此,实现这一目标的快速方法将是很好的

4 个答案:

答案 0 :(得分:1)

一种解决方案是将(x, y)映射到自然数(例如z)。

z = N * x + y
x = z / N (integer division)
y = z % N

在这种情况下,您应该使用int list[N * N];

另一个解决方案是在找到零时存储坐标,例如:

list_x[site_num] = x;
list_y[site_num] = y;
site_num++;

或者您可以定义两个int的结构。

答案 1 :(得分:1)

嗯,可以使用一些指针算法。

您拥有第一个格子元素的地址和列表中所有零字段的地址。你知道布尔的大小。通过从零字段地址中减去第一个元素地址并除以bool的大小,您将得到一个linar索引。可以使用模和除法将此线性指数计算为2-dim指数。

但是为什么不在列表中存储2-dim索引而不是地址?你需要addess还是只需要索引?
你应该考虑转动for循环(外循环i,内循环j)。

答案 2 :(得分:0)

struct ListCoords
{
   int x, y;
} coords[n*n];

for(i = 0; i < site_num; i++)
{
    int index = list[i] - &lattice[0][0];
    coords[i].x = index % n;
    coords[i].y = index / n;
}

我可能会根据您的需要提供%和/运算符,但这应该会给您提供这个想法。

答案 3 :(得分:-1)

如何提取数组中每个零点的x,y坐标?换句话说,有没有办法通过引用它的地址来返回数组元素的索引?
你不能。就那么简单。如果您需要该信息,则需要将其与相关数组一起传递。

bool *list[n*n];是C89中的非法声明(编辑:除非你做了一个宏(哎呀!)),你可能希望注意到可变长度数组是C99特征。