【问题标题】:(Conceptual) Iterating through an array of ints using a pointer(概念)使用指针遍历整数数组
【发布时间】:2016-02-14 12:07:11
【问题描述】:

我是一个新手,试图围绕指针的概念来思考。到目前为止,它一直进展顺利,除非我尝试使用 for 循环来处理数组。我没有以正常方式索引数组,而是使用指针。这就是我注意到一些我无法理解的特殊性的地方。

所以,例如。假设我想打印 numArray 的前四个值:

int numArray = [1, 5, 10, 15, 20]

现在有了指针,我的方法是这样的:

int *ptr = numArray;
for (ptr; *ptr < *(ptr + 4); ptr++)
{
    std::cout << *ptr << std::endl;
}

这不起作用,尽管我认为 *(ptr + 4) 与 numArray[4] 相同。

但是,如果我对停止条件的处理略有不同:

int *ptr = numArray;
int end = *(ptr + 4);
for (ptr; *ptr < end; ptr++)
{
    std::cout << *ptr << std::endl;
}

然后它突然给了我我想要的东西,尽管代码并没有太大的不同。

那么为什么会这样呢?我觉得答案可能很明显,但我没有掌握它。为什么将 *(ptr + 4) 放在 for 循环中会导致如此大的差异?为什么指针会这样表现?

【问题讨论】:

  • 您正在递增ptr,因此ptrptr + 4 都是移动目标。

标签: c++ arrays pointers


【解决方案1】:
for (ptr; *ptr < *(ptr + 4); ptr++)   
/* after ptr is incremented (ptr+4) is again calculated in iterations  */

在第一次迭代后的循环中,*(ptr+4)超出范围在每次迭代中计算),因为您增加 ptr 并取消引用它会导致未定义的行为。在下一次迭代中也会发生同样的事情。

在后一种情况下不会发生上述情况,因为end 保持不变并且不会随着ptr 而改变,因为ptr 会增加,因此它可以工作。

【讨论】:

  • 喔喔喔,这真的很简单。谢谢!
  • @Jimmy_Rustle 很高兴它有帮助:)。
【解决方案2】:

为什么将 *(ptr + 4) 放在 for 循环中会造成如此大的差异?

因为您在循环中将ptr 增加了ptr++,这意味着(ptr + 4) 每次都会改变(即一个接一个地移动)。

顺便说一句:循环的条件基于元素的值,而不是位置。如果要打印出前 n 个元素,则仅在对数组进行排序时才正确。我想应该是:

int *ptr = numArray;
int *end = ptr + 4;
for (ptr; ptr < end; ptr++)
{
    std::cout << *ptr << std::endl;
}

【讨论】:

  • 这是一个更好的写法,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2014-03-05
相关资源
最近更新 更多