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