我已经研究了数学如何使用指针,但有一件事令我困惑
例如:
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进行比较?
答案 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
。如果a
为a
,则实际上意味着int *
字节。
减法也是如此 - 这就是为什么a += 1 * sizeof(int)
在两个指针之间返回元素的数量,而不是字节数。