2021-09-29 《C++primer》3.6节练习 关于范围for循环处理多维数组

在做3.43练习时,使用范围for循环遍历二维数组的元素,代码如下:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    for(int *row : ia){
        //cout<<row[0]<<endl;
        for(int col : row){
            cout<<col<<endl;
        }
    }
    return 0;
}

然后第二个for循环报错:此基于范围的“for”语句需要适合的 “begin” 函数,但未找到
为解决此错误,开始翻书:

1.范围for循环

C++11新标准中的语句,形式:for (declaration : expression),其中exp表示一个序列,dec负责访问序列中的基础元素。(《C++primer》P82)

  • 第一个for循环中:for(int *row : ia),ia是一个二维数组,二维数组是数组的数组,但编译器会将其自动转为指针,于是ia就变为了一个含有三个元素的指针,而每个元素又是含有4个int型数字的指针。

貌似第一个for循环并没有出错,因为ia序列中的基础元素就是指针,那第二个for循环:for(int col : row),又是什么意思呢?

  • 注意到第二个for循环中的row是一个指针,并不是一个序列,所以此时出现了错误,因为编译器无法在一个指针内遍历。(《C++primer》P114)

所以书上才会强调:范围for循环处理多维数组,除了最内层的循环外,其余的循环控制变量都应该是引用类型

2.确定引用的对象

显然,row应该是一个包含四个元素的数组,那么改如何引用呢?

  • for(int *&row : ia),报错:无法用 “int [4]” 类型的值初始化 “int *&” 类型的引用(非常量限定)。
  • for(int (&row)[4] : ia),正常运行。

第一个引用,没指出数组的大小,所以失败了。

3.最终代码

#include<iostream>
using namespace std;
int main()
{
    int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    for(int (&row)[4] : ia){
        //cout<<row[0]<<endl;
        for(int col : row){
            cout<<col<<"\t";
        }
        cout<<endl;
    }
    return 0;
}

4.总结

数组类型和指针类型实际上是不一样的,只是编译器在处理数组时,习惯将其转为指针进行处理。(因为数组需要指明大小)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值