C++primer学习笔记-----3.6多维数组

严格来说,C++ 语言中没有多维数组,通常所说的多维数组其实是数组的数组(尽量不要当成一维数组理解,虽然可能存储结构是如此实现的)

多维数组的声明语句可以按照由内到外的阅读顺序来理解其实际含义

对于二维数组来说,常把第一个维度称为行,第二个维度称为列。


【多维数组的初始化:

允许使用花括号括起来的一组值初始化多维数组,这点和普通的数组一样。下面的初始化形式中,多维数组的每一行分别用花括号括了起来

int ia[3][4] = {
{0, 1, 2, 3}, // 第一行的初始值
{4, 5, 6, 7}, // 第二行的初始值
{8, 9, 10, 11}, // 第三行的初始值
};
其中内层嵌套着的花括号并非必须的,将内层花括号都去掉的声明语句与以上语句也是等价的。

类似于一维数组,在初始化多维数组时也并非所有元素的值都必须包含在初始化列表之内:

int ia[3][4] = {{0},{4},{8}}; // 除了ia[0][0], ia[1][0], ia[2][0] 其余元素都被默认初始化为0
int ia[3][4] = {0, 4, 8}; // 除了ia[0][0], ia[0][1], ia[0][2] 其余元素都被默认初始化为0


【多维数组的下标引用:

如果表达式含有的下标运算符数量和数组的维度一样多,该表达式的结果将是给定类型的元素;反之,如果表达式含有的下标运算符数量比数组的维度小,则表达式的结果将是给定索引处的一个内层数组。】


【使用范围for 语句处理多维数组:

for(auto &row : ia) // row 被推断为绑定在含有四个元素的一维数组上的引用
   for(auto &col : row) // row 实际上是ia 中的某个含有四个元素的一维数组,故col 被推断为整形的引用
       col++;
上一节中,说过如果使用auto 直接对数组的名字进行类型推断,得到的类型将会是指针类型:

for(auto row : ia) 
// row = ia[i]  观察上一条语句,row 在每个循环中,将执行左边这条语句,成为指向内层数组首元素的指针,进而不能作为更内层范围for 循环的运算对象
但是如果使用&row,则在内层范围for 循环中,row 将会被替换为其绑定的内层数组,可以作为范围for 循环的运算对象。

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


【指针和多维数组:

当程序使用多维数组的名字时,也会自动将其转换成指向数组首元素的地址。

因为多维数组实际上是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针

for(auto p = begin(ia); p != end(ia); ++p)
   for(auto q = begin(*p); q != end(*p); ++q)
       (*q)++; // 实现的功能与范围for 循环的功能相同
由于多维数组的名字可以转换为指针,多层数组间的指针关系又比较混乱,可以使用auto 运算符,避免进行复杂的推断类型的工作(倒不如说, auto 运算符的价值,就在于能够快速高效地推断出语句所需要的类型)。】


【另外,使用类型别名来重定义内层数组类型的名字,也能有效地简化多层数组间的复杂关系。】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值