首页 > 代码库 > C++的auto在用多维数组进行初始化时一个易混淆的情况
C++的auto在用多维数组进行初始化时一个易混淆的情况
先看下面这段程序:
int arr[1][10] = {0,1,2,3,4,5,6,7,8,9};for (auto *p = arr;p != end(arr); p++){ cout << "p is " << typeid(p).name() <<endl; cout << "*p is " << typeid(*p).name() <<endl;}for (auto *q : arr){ cout << "q is " << typeid(q).name() <<endl; cout << "*q is " << typeid(*q).name() <<endl;}for (auto &r : arr){ cout << "r is " << typeid(r).name() <<endl;}
程序运行的结果为
p is int (*)[10]
*p is int [10]
q is int *
*q is int
r is int [10]
C++中,对数组进行操作时通常是对指针进行操作。用数组名来初始化一个指针时,得到的是指向该数组第一个元素的指针。
多维数组的实质是元素为数组的数组。如int a[3][4]是一个有三个元素的数组,其元素是有四个整型元素的数组。因此,auto *p = a,p是指向数组a的第一个元素的指针,即指向有四个整型元素的数组的指针,*p是a的第一个元素,即有四个整型元素的数组。
但在range for中,例子里的auto *q = arr却是指向数组元素(有四个元素的数组)的第一个元素的指针。因此q是指向整型元素的指针。如果数组有更多维,如int a2[3][4][5],a2的第一个元素是一个有四个元素的数组,这四个元素都是有五个整型元素的数组。此时for(auto *p : a2)中,p的类型是int (*)[5]。
为了防止这种差别带来的错误,可以在range for中使用引用。for (auto &r : arr)中,r是数组元素的引用,其类型跟auto *p = arr, *p相同。
C++的auto在用多维数组进行初始化时一个易混淆的情况
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。