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

时间:2010-04-05 14:38:42

标签: c pointers

在C中,我已经声明了这样的内存区域:

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

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

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

我的问题是,当我增加*current_cell时,我怎么知道我是否到达了分配的内存区域的末尾?

4 个答案:

答案 0 :(得分:6)

if (current_cell >= memory + cells)
   no_longer_in_valid_memory;

然而!您的代码中存在大问题。如果您希望current_cell位于内存区域中间附近,您应该实际执行此操作:

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

指针算术将处理乘以sizeof(int)。

答案 1 :(得分:3)

当你在有效指数范围内时,以下情况属实:

memory <= current_cell && current_cell < memory + cells

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

current_cell < memory + cells

但请注意 - 您可能会将地址增加一个错误值,使其溢出并变得小于memory。如果你确定不会发生溢出,只能使用第二个简化条件。

答案 2 :(得分:1)

  

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

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

实际上,没有。 正确表达式为:

int* middle = memory + cells / 2;

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

memory + 1

指针不是增加一个字节,而是增加sizeof(int)个字节。

答案 3 :(得分:1)

数组中的索引(从memory开始,相当于指针current)只是current - memory - “缩放”(sizeof(int))是照顾你。所以,你知道指针是有效的(即,在cells - 从memory开始的长数组的范围内)当且仅当索引是>=0<cells时(在您的示例中包括0到511):

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