多维数组
1.指针和多维数组
1.由多维数组名转换得来的指针实际上是指向第一个内层数组的指针
int ia[3][4];
int (*p)[4]=ia; // p指向含有4个整数的数组
2. int a[5]; a和&a &a[0]地址一样 但是类型不同 a和&a[0]是int* 而&a是int (*p)[5]类型
int a[3][4]; &a为二维数组的地址,类似于int(*p)[3][4] ++p未定义 a和&a[0]地址一样,都是第一维的首地址,类似于int (*p)[4]=a; ++p和&a[1]相等
&a[0][0] 第一维第一个位置的地址 类似于int *p ++p和&a[0][1]相等;
3. int ia[3][4];
int (&row)[4]=ia[1]; // 把row绑定到ia的第二个4元素的数组中 也就是第二行
2.使用范围for语句处理多维数组
1. size_t cnt = 0;
int ia[3][4];
for(auto &row:ia) // 遍历ia中所有的元素 这些元素是大小为4的数组
for(auto &col:row) // 遍历大小为4数组中某一个 col为整数的引用
{
col=cnt;
++cnt;
}
for(auto row:ia) // ia数组 编译器自动转换为指针类型,row类型为int *
for(auto col:row) // 编译器试图在int *遍历,这与程序相差甚远 错误
注意:使用范围for循环语句处理多维数组,除了最内层外,其他所有的控制循环变量都应该是引用类型。
2. int ia[3][4]={1,1,12,34};
// p指向ia的第一个数组(含有四个整数元素数组的地址)
for(auto p=begin(ia);p!=end(ia);++p) // p的类型为int (*p)[4]
for(auto q=begin(*p);q!=end(*p);++q) // q的类型为int *
cout<<*q<<endl;