代码之家  ›  专栏  ›  技术社区  ›  Federico klez Culloca

如何用指针算法判断我在数组中的位置?

  •  4
  • Federico klez Culloca  · 技术社区  · 16 年前

    在C语言中,我已经声明了这样一个内存区域:

    int cells = 512;
    int* memory = (int*) malloc ((sizeof (int)) * cells);
    

    我把自己或多或少地放在中间

    int* current_cell = memory + ((cells / 2) * sizeof (int));
    

    我的问题是,当我增加 *current_cell ,如何知道是否已到达分配内存区域的末尾?

    4 回复  |  直到 16 年前
        1
  •  6
  •   Bill Lynch    16 年前
    if (current_cell >= memory + cells)
       no_longer_in_valid_memory;
    

    然而!你的代码有一个大问题。如果您希望当前的单元位于内存区域的中间,您应该实际执行以下操作:

    int* current_cell = memory + (cells / 2);
    

    指针算法将负责乘以sizeof(int)。

        2
  •  3
  •   sharptooth    16 年前

    当您在有效索引范围内时,以下内容适用:

    memory <= current_cell && current_cell < memory + cells
    

    所以如果你只增加地址就足够检查

    current_cell < memory + cells
    

    但是要小心-您可能会增加地址的错误值,使其溢出并小于 memory . 只有在确信不会发生溢出时,才使用第二个simpiled条件。

        3
  •  1
  •   Konrad Rudolph    16 年前

    我把自己或多或少地放在中间

    int* current_cell = memory + ((cells / 2) * sizeof (int));
    

    事实上,不是的。 对的 表达式为:

    int* middle = memory + cells / 2;
    

    因为指针算法会考虑指针的类型。换句话说,这个表达式:

    memory + 1
    

    指针的增量不是一个字节而是 sizeof(int) 字节。

        4
  •  1
  •   Alex Martelli    16 年前

    数组中的索引,从 memory ,相当于指针 current 只是 current - memory --“缩放”(通过 sizeof(int) )会照顾好你的。所以,您知道指针是有效的(即,在 cells -长数组起始于 记忆 )如果且仅当索引是 >=0 <cells (示例中包括从0到511):

    ((current - memory) >= 0) && ((current - memory) < cells)