作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23579860
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://zhuanlan.zhihu.com/p/23579860
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:
- 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
- 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
- 本文仅作学习交流使用,禁止任何形式的转载
多维数组其实就是数组的数组
int ia[3][4];
由内向外读:ia是含有3个元素的数组,它的每个元素都是含有4个整数的数组
初始化
int ia[3][4] = {
{
0, 1, 2, 3}, {
4, 5, 6, 7}, {
8, 9, 10, 11} };
本质上和一维数组的初始化没有区别,ia有3个元素,所以外层花括号里面有3个花括号,每个花括号分别用来初始化ia的一个元素
和一维数组一样,也可以只给出一部分初始值
int ix[3][4] = {
{
0}, {
4}, {
8} };
int ia[3][4] = {
0, 3, 6, 9 };
下标
ia[2][3] 返回ia第二个元素(数组)的第三个元素
ia[1] 返回ia的第一个元素(数组)
注意理解多维数组其实就是数组的数组就可以了
范围for
可以使用for循环和范围for来遍历多维数组
在使用范围for时,最好将控制变量都声明为引用类型
size_t cnt = 0;
for( auto &row : ia )
{
for( auto &col : row )
{
col = cnt;
++cnt;
}
}
如果不声明为引用类型
扫描二维码关注公众号,回复:
12227514 查看本文章
for( auto row : ia )
for( auto col : row )
第一行取ia的每个元素,是数组类型,会被编译器转换为指向首元素的指针,第二行就会报错
因此,只有最内层的循环可以不使用引用类型
简单起见,最好都使用引用类型
指针和多维数组
多维数组的数组名也会自动转换为指针
int ia[3][4];
auto p = ia;
理解过程:
- ia是一个含有3个元素的数组
- 它的每个元素都是含有4个元素的数组。
- 因此,它的首元素也是含有4个元素的数组
- 指向首元素的指针就是指向含有4个元素的数组的指针
等价于
int (*p)[4] = ia;
遍历每个元素
for( auto p = ia; p != ia + 3; ++p )
{
for( auto q = *p; q != *p + 4; ++ q )
{
cout << *q << ' ';
}
cout << endl;
}
对p解引用可得到含有4个元素的数组,*p是指向它的首元素的指针
也可以使用begin和end函数
for( auto p = begin(ia); p != end(ia); ++p )
{
for( auto q = begin(*p); q != end(*p); ++ q )
{
cout << *q << ' ';
}
cout << endl;
}
使用类型别名简化书写
using int_array = int[4];
typedef int int_array[4];
别忘了,typedef的形式和变量声明类似