我还没有找到能回答我困惑的部分的问题,如果有人回答了我,我深表歉意。
我对这个for循环中发生的事情感到困惑,它如何遍历地址?
int arr[] = {1,2,3,4,5};
for(const int &arrEntry : arr){
cout << arrEntry << " ";
}
答案 0 :(得分:5)
也许std::vector<int>
的位置引起混乱。请记住,C ++不在乎您在何处放置空格。由于以下内容:&
是新变量for (const int &arrEntry : arr)
的声明,可在循环内使用,因此在其名称的左侧使用arrEntry
表示我们定义的对象具有 reference 类型,特别是&
是对arrEntry
的引用。这意味着在循环中,const int
不是您要循环访问的数据的副本,而是对其的引用。 arrEntry
表示您无法更改其值。
如果这不是声明,并且先前定义了const
,则表达式arrEntry
的确将采用&arrEntry
的地址。在循环体内,已经定义了arrEntry
,因此您可以使用arrEntry
&arrEntry
答案 1 :(得分:3)
C ++中基于范围的for循环实际上只是语法糖,它等效于以下内容(由cppreference提供:
for (range_declaration : range_expression) loop_statement;
// is equivalent to:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
在上面的代码块中,begin_expr
和end_expr
分别等效于std::begin(__range)
和std::end(__range)
。
因此,在使用const int &arrEntry
的情况下,arrEntry
实际上是在“真实”(常规)for循环内声明的,因此在每次迭代中它都引用范围内的另一个对象,就像直接使用原始迭代器。
请注意,如果在普通的for循环之外声明arrEntry
,则不可能实现此操作,因为无法将引用重新指向引用不同的对象。
要考虑的另一个重要的(侧面)事实是range_expression
在循环的整个过程中都保持活动状态,这意味着您可以在其中使用prvalue(例如,调用返回{按值{1}}。
答案 2 :(得分:2)
在您的代码中,&arrEntry是对arr的引用。这在基于范围的前循环中是隐含的。
for(const int &arrEntry : arr){
cout << arrEntry << " ";
}
您可以在没有参考的情况下进行操作,结果是相同的。 但是请注意,arr的值已复制到arrEntry。
for(const int arrEntry : arr){
cout << arrEntry << " ";
}