(概念)使用指针遍历整数数组
(Conceptual) Iterating through an array of ints using a pointer
我是一个新手,试图围绕指针的概念。到目前为止,它一直进展顺利,除了当我尝试使用 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;
}
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 避免在遍历 IShellItemArray 时出现代码重复
- 从特定键开始遍历地图
- 关于链表遍历和调试的困惑
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 使用 c while 循环遍历所有整数数组元素
- (概念)使用指针遍历整数数组