(概念)使用指针遍历整数数组

(Conceptual) Iterating through an array of ints using a pointer

本文关键字:遍历 整数 数组 指针 概念      更新时间:2023-10-16

我是一个新手,试图围绕指针的概念。到目前为止,它一直进展顺利,除了当我尝试使用 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 循环中会导致如此大的差异?指针究竟为什么会这样?

for (ptr; *ptr < *(ptr + 4); ptr++)   
/* after ptr is incremented (ptr+4) is again calculated in iterations  */

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

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

为什么将 *(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;
}