首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针减法的机理

指针减法的机理
EN

Stack Overflow用户
提问于 2015-02-03 10:24:55
回答 1查看 50关注 0票数 0

我研究过数学是如何使用指针的,但有一件事让我很困惑

例如:

代码语言:javascript
复制
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进行比较?

EN

回答 1

Stack Overflow用户

发布于 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个元素。如果aint *,它实际上表示a += 1 * sizeof(int)字节。

减法也是如此-这就是为什么ages_ptr - ages返回两个指针之间的元素数,而不是字节数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28290325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档