c++primer之多维数组

多维数组
严格来说,C++语言中没有多为数组,通常所说的数组其实是数组的数组。记住这一点,对理解和使用多维数组大有益处。
当一个数组的元素仍然是一个数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,另一个维度表示其元素(也是数组)大小。

int ia[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组
// 大小为10的数组,它的每个元素都是大小为20的数组,
// 这些数组的元素是含有30个整数的数组。
int arr[10][20][30] = {0};  // 将所有元素初始化为0。

多维数组的初始化

例:
int ia[3][4] = {    // 3个元素,每个元素都是大小为4的数组。
     {0,1,2,3},        // 第一行的初始值
     {4,5,6,7},        // 第二行的初始值
     {8,9,10,11}     // 第三行的初始值
};

内层嵌套的花括号并非必要。

例如:
// 没有标识每行的花括号,与之前的初始化语句是等价的。
int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

并非所有元素的值都必须包含在初始化列表之内。

// 显式的初始化每行的首元素
int ia[3][4] = {{0},{4},{8}};

// 显式地初始化第一行,其他元素执行值初始化
int ia[3][4] = {0,3,6,9};

多维数组的下标引用

// 用arr的首元素为ia最后一行的最后一个元素赋值
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1];  //把row绑定到ia的第二个4元素数组上

程序中经常会用到两层嵌套的for循环来处理多维数组的元素。

constexpr  size_t  rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt];  // 12个未初始化的元素
// 对于每一行
for(size_t i=0; i!=rowCnt; ++i)
{
      // 对于行内的每一列
      for(size_t j=0; j!=colCnt; ++j)
          // 将元素的位置索引作为它的值
          ia[i][j] = i*colCnt +j;
}

使用范围for语句处理多维数组
前一个程序可以简化为:

size_t cnt = 0;
for(auto &row : ia)
{
       for(auto &col : row)
       {
            col = cnt;
            ++cnt;
       }
}

注意:要使用范围for语句处理多维数组,除了最外层的循环外,其他所有循环的控制变量都应该是引用类型。

指针和多维数组

定义指向多维数组的指针时,千万多忘记了这个多维数组实际上是数组的数组。
因为多维数组是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针:
int ia[3][4]; //大小为3的数组,每个元素是含有4个整数的数组
int (*p)[4] = ia; // p是指向含有4个整数的数组
p = &ia[2]; // p指向ia的尾元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值