作者woody3724 (woody)
看板C_and_CPP
标题[问题] range for with multidimensional arrays
时间Thu Apr 20 18:18:12 2017
目前正在读 C++ Primer 5th edition
int ia[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
for(auto row : ia)
for(auto col : row)
cout<< col <<endl;
这样子compile是不会过的
外层回圈的
row必须要是reference才行,也就是
&row
书上的理由如下:
Because
row is not a reference, when the compiler initializes
row it will
convert each array element (like any other object of array type) to a pointer
to that array's first element. As a result, in this loop the type of
row is
int*, The inner for loop is illegal. Despite our intentions, that loop
attempts to iterate over an int* .
reference不就是让一个变数有了另一个名称,并且这两个名称都使用同一块记忆体
位址吗?
为甚麽有reference的话,each array element就不会被转换成指向第一个元素的指标?
请问为什麽row要reference呢
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 219.85.166.154
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1492683495.A.B92.html
※ 编辑: woody3724 (219.85.166.154), 04/20/2017 18:27:41
1F:推 LPH66: ia 的形态是 int[3][4], 或曰「长度为 3 的 int[4] 阵列」 04/20 21:36
2F:→ LPH66: 也就是其元素形态是 int[4], 根据规则一个如此形态的值 04/20 21:36
3F:→ LPH66: 会 decay 成指向其首元素的指标, 这就是文中在讲的那个 04/20 21:36
4F:→ LPH66: 也就是说, 第一个 auto 会被推断为 int[4] 然後发生 decay 04/20 21:37
5F:→ LPH66: 但如果是参考的话, int(&)[4] 是一个对如此阵列的参考 04/20 21:37
6F:→ LPH66: 这样就不会被 decay 而可以进行内层的 for 了 04/20 21:38
喔喔喔!! 我懂了,非常感谢
※ 编辑: woody3724 (219.85.134.2), 04/23/2017 16:34:44
7F:→ hunandy14: 改成 auto& 就可以是因为这样就会直接抓参考吗 04/27 13:26
8F:→ hunandy14: 阿 没事我懂了 int& arr 卡了一下... 04/27 13:28