3.6 多重数组

本文详细介绍了C++中的多维数组,包括其本质是数组的数组,如何进行初始化,以及如何通过引用和指针进行访问。文中还探讨了范围for语句在处理多维数组时的应用,并展示了如何使用类型别名简化指针操作。此外,还特别强调了在定义指向多维数组的指针时需要注意的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

严格来说C++没有多维数组,多维数组就是数组的数组

  int ia[3][4];//大小为3的数组,每个元素是含有4个整数的数组

  int arr[10][20][30] ={0}

//大小为10的数组,每个元素是大小为20的数组,这些数组的元素是含有为30个整形的数组,所有元素初始化为0

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

多维数组的初始化

  int ia[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},{3},{4}};

//显示初始化第一行,其他元素执行初始化

 int ia[3][4] = {0,3,6,9};

多维数组的下标引用

访问时,每个数组对应一个下标运算符

 下标运算符和数组维度一样多,该表达式的结果将是给定类型的元素

 比数组维度小,表达式结果将是给定索引的一个内层函数

//用arr的首元素为ia的最后一样的最后一个元素赋值

 ia[2][3] = arr[0][0][0];

 int (&row) [4] = ia[1]

//把row绑定到ia的第二个四元素数组上 (前面有)

把row定义成了含有4个整数的数组的引用

 

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

 size_t cnt = 0;

 for (auto &row : ia)               //对于外层数组的每一个元素

 for(auto &col :row){      // 对于内层数组的每个元素

 col =cnt;

 ++cnt;

}

如果不用引用类型

 for(auto row:ia)

 for(auto col :row)

程序将无法通过

编译器初始化row的时候会自动将这些数组形式的元素转换成指向该数组内首元素的指针,row的类型就是int*

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

 

指针和多维数组

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

Note:定义指向多维数组的指针是,千万别忘了这个多维数组实际上是数组的数组

 

 int ia[3][4];

 int (*p)[4] = ia;  //p指向含有4个整数的数组

 p = &ia[2] //p指向a的为元素

Note:上述声明中,圆括号必不可少

 int *ip[4];   // 整形指针的数组

 int (*ip)[4];  // 指向含有4个整数的数组

 

通过使用auto或者decltype就能尽可能避免在数组前面加上一个指针类型了

//输出ia中每个元素的值,每个内层数组各占一行

//p指向含有4个整数的数组

 for(auto p = ia; p != ia+3; ++p){

// q指向4个整数数组的首元素,也就是说,q指向一个整数

 for(auto q = *p; q != *p+4;++q)

 cout << *q << ' ';

 cout  <<endl;

}

用标准库的begin和end能看起来更加简洁

 for(auto p = begin(ia);p != end(ia);++p)

类型别名简化多维数组的指针

 using int_array = int[4];

 typedef int int_array[4]; //等价的typedef

 程序将类型 “4个整数组成的数组”命名为int_array ,用int_array定义外层循环变得简洁明了

 for (int_array * p = ia; p!= ia+3; ++p)

正常写法 int (*p)[4] = ia;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值