先看下面这段程序:
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相同。
时间: 2024-10-25 13:41:41