首页 > 代码库 > 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在用多维数组进行初始化时一个易混淆的情况