指针减法的机制

时间:2015-02-03 02:24:55

标签: c pointers

我已经研究了数学如何使用指针,但有一件事令我困惑

例如:

int ages[]={10,20,30,40,50};
int* ages_ptr=ages;
for(ages_ptr;(ages_ptr-ages)<=4;ages_ptr++)
{
      printf("%d"*ages_ptr);
}
(ages_ptr-ages)<=4

这是我的问题,age_ptr-ages的结果如何与int进行比较?

1 个答案:

答案 0 :(得分:1)

这一行:int *ages_ptr = ages大致相当于:int *ages_ptr = &ages[0]

这意味着它是指向数组第一个元素的指针。实际上,ages == &ages[0]

当您编写ages_ptr++时,它会将指针移动sizeof(int)个字节,因此移动到数组的 next 元素,因此&ages[1],{{1}等等。

指针只是数字 - 例如,&ages[2]的值为&ages[0]。它有N个元素,因此最后一个元素位于m的地址。

最初,N + (m - 1) * sizeof(int)的值也是*ages_ptr。在每次迭代N上,它都会移至i

在循环条件中,您有:N + i * sizeof(int)。这个(ages_ptr - ages) <= 4实际上是4,因此m - 1。通过替换,我们得到:(ages_ptr - ages) <= m - 1,所以N + i - N <= m - 1,在我们的案例中为i < m - 1。 (此i < 4可能会在这里产生一些误导,因为巧合4也是如此。)

注意在替换中如何删除sizeof(int) == 4 - 因为我们正在处理指针,所以我们会自动处理加/减的值。如果您编写sizeof(int),则表示按x元素移位指针a += x 。如果aa,则实际上意味着int * 字节

减法也是如此 - 这就是为什么a += 1 * sizeof(int)在两个指针之间返回元素的数量,而不是字节数。