迭代指向其他数组的数组

时间:2017-02-03 08:20:57

标签: c arrays pointers

我想迭代一个包含指向其他数组的指针的数组。

typedef struct {
  uint8_t upperLimit, lowerLimit;
} Poi;

Poi poi_new(uint8_t upperLimit, uint8_t lowerLimit) {
  Poi i;
  i.upperLimit = upperLimit;
  i.lowerLimit = lowerLimit;
  return i;
}

Poi lox1_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };
Poi lox2_POI[] = { poi_new(40,50) };
Poi lox3_POI[] = { poi_new(40,50) };
Poi lox4_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };

Poi * pois[] = { lox1_POI , lox2_POI , lox3_POI , lox4_POI };

此时如何迭代pois然后迭代它指向的任何数组?

我已经开始使用下面的代码了,但是我很容易弄错语法:

for (int c = 0; c++; c < sizeof(*pois[i])) {
    //... now to iterate over the internal lists
}

2 个答案:

答案 0 :(得分:2)

您可以使用哨兵:即{0, 0}以了解何时停止迭代:

Poi lox1_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90), {0, 0} };
Poi lox2_POI[] = { poi_new(40,50), {0, 0} };
Poi lox3_POI[] = { poi_new(40,50), {0, 0} };
Poi lox4_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90), {0, 0} };

Poi *pois[] = { lox1_POI , lox2_POI , lox3_POI , lox4_POI };
Poi *ptr;

for (int c = 0; c < sizeof(pois) / sizeof(pois[0]); c++) {  /* Note condition in the middle */
    printf("%d)\n", c);
    //... now to iterate over the internal lists
    ptr = pois[c];
    while ((ptr->upperLimit != 0) && (ptr->lowerLimit != 0)) {
        printf("\t%d %d\n", ptr->upperLimit, ptr->lowerLimit);
        ptr++;
    }
}

或者您可以创建一个包含这些元素及其大小的表格:

Poi lox1_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };
Poi lox2_POI[] = { poi_new(40,50) };
Poi lox3_POI[] = { poi_new(40,50) };
Poi lox4_POI[] = { poi_new(40,50), poi_new(60,70) , poi_new(80,90) };

struct poi_table {
    Poi *elem;
    size_t elems;   
} table[] = {
    { lox1_POI, sizeof(lox1_POI) / sizeof(lox1_POI[0]) },
    { lox2_POI, sizeof(lox2_POI) / sizeof(lox2_POI[0]) },
    { lox3_POI, sizeof(lox3_POI) / sizeof(lox3_POI[0]) },
    { lox4_POI, sizeof(lox4_POI) / sizeof(lox4_POI[0]) }
};

for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++) {
    printf("%d)\n", i);
    //... now to iterate over the internal lists
    for (int j = 0; j < table[i].elems; j++) {
        printf("\t%d %d\n", table[i].elem[j].upperLimit, table[i].elem[j].lowerLimit);
    }
}

输出:

0)
    40 50
    60 70
    80 90
1)
    40 50
2)
    40 50
3)
    40 50
    60 70
    80 90

答案 1 :(得分:1)

要正常获取数组中元素的数量,可以将数组的大小(例如sizeof pois)除以单个元素的大小(例如sizeof pois[0])。

请注意,这仅适用于实际数组,如果将数组传递给函数,它将衰减为指向数组第一个元素的指针,sizeof运算符将返回指针而不是它指向的内容。

要在技术上正确,请记住sizeof表达式的类型是size_t,因此迭代器变量(示例中为c)应为{{1}变量。

最后,size_t语句中表达式的 order 中存在一个非常基本的问题。 for语句为for。您已切换for (init; condition; increment)condition

全部放在一起,迭代increment你做

pois