委员 2025-01-16 22:43 采纳率: 0%
浏览 27
已结题

使用c++11新特性for ( : ) 来遍历二维数组时,为啥要用引用?

c++打印二维数组,代码中为啥一个用 auto& ,而另一个用 auto ?

#include<iostream>

int main()
{
    int x[2][3] = { {1,2,3} ,{4,5,6} };
    for (auto& i : x)
    {
        for (auto j : i)
        {
            std::cout << j << std::endl;
        }    
    }
}

若都用auto,编译会报错

img

  • 写回答

4条回答 默认 最新

  • 火花20180731 2025-01-17 14:45
    关注

    两个问题:
    1.为什么要用引用遍历?
    答:从汇编角度来说,CPU与外界的交互是通过寄存器实现的,把变量的地址提交(也就是赋值)到寄存器中,CPU就可以从寄存器读到变量的地址,进而按地址去访问变量的内存。引用是用寄存器实现的,相当于把目标内存的地址直接提交到了某类寄存器中,所以引用的方式是CPU直接访问数组x的元素的内存单元。不使用引用,相当于要创建的一个临时变量i,再把元素里的数值拷贝给i,然后CPU实际访问的是新建的这个临时变量i,而非数组x的元素。从访问效率上来说,那自然是引用最直接。
    2.为什么不能嵌套auto?
    编译器对代码的扫描解析是通过栈实现的,auto只能对应到当前栈里的东西,并不能跨越栈帧。
    { {... 编译器要逐字符得扫描代码,通过{ ;}等符号,识别语句、关键字、变量名等,何时开始,何时结束,当前累积的代码字符集只能对应到当前层级 ...} }

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月23日
  • 修改了问题 1月16日
  • 修改了问题 1月16日
  • 修改了问题 1月16日
  • 展开全部