我研究过数学是如何使用指针的,但有一件事让我很困惑
例如:
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这是我的问题,如何将ages_ptr-ages的结果与int进行比较?
发布于 2015-02-03 15:31:01
这一行:int *ages_ptr = ages大致相当于:int *ages_ptr = &ages[0]。
这意味着它是指向数组第一个元素的指针.实际上,是ages == &ages[0]。
当您编写ages_ptr++时,它将指针移动sizeof(int)字节,因此移动到数组的下一个元素,因此移动到&ages[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) -因为我们处理的是指针,所以加/减的值是自动为我们处理的。如果您编写a += x,您的意思是将指针a移位x个元素。如果a为int *,它实际上表示a += 1 * sizeof(int)字节。
减法也是如此-这就是为什么ages_ptr - ages返回两个指针之间的元素数,而不是字节数。
https://stackoverflow.com/questions/28290325
复制相似问题