(概念)使用指针

时间:2016-02-14 03:50:07

标签: c++ arrays pointers

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

  

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

由于您在循环中将ptr增加ptr++,这意味着(ptr + 4)每次都会更改(即逐个移动)。

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

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