1.
一个一维数组名,是对该一维数组中的第一个元素取地址。数值上是该一维数组的第一个元素的地址;逻辑上指向的是一维数组的第一个元素,所以将一维数组名+1所指向的是一维数组的下一个元素的地址;
eg. 一个int类型元素组成的一维数组名指向一维数组中的第一个元素(int类型),所以一维数组名类型为int*;
2.
2.1 一个二维数组名,是对该二维数组中的第一个一维数组名取地址。数值上与第一个一维数组名的值是相同的,即是第一个一维数组的第一个元素的地址;逻辑上指向的是二维数组的第一个元素,即二维数组中的第一个整一个一维数组,所以将二维数组名(即二维数组的第一个一维数组名的地址)+1所指向的是二维数组的下一个元素的地址,即二维数组中的第二个整个一维数组;
eg. 一个int类型元素组成的二维数组名指向二维数组中的第一个元素,即一整个一维数组(int[n]类型,n为该二维数组中的每一个一维数组的长度,n是已知的常量),所以二维数组名类型为int*[n](不是int**);
3.
一个三维数组名,是对该三维数组中的第一个二维数组名取地址。数值上与第一个二维数组名的值是相同的,也即与第一个二维数组的第一个一维数组名的值是相同的,也即是第一个二维数组的第一个一维数组的第一个元素的地址;逻辑上指向的是三维数组的第一个元素,即三维数组中的第一个整一个二维数组,所以将三维数组名(即三维数组的第一个二维数组名的地址)+1所指向的是三维数组的下一个元素的地址,即三维数组中的第二个整一个二维数组;
eg. 一个int类型元素组成的三维数组名指向三维数组中的第一个元素,即第一个一整个二维数组(int[n][m]类型,n为该三维数组中的每一个二维数组的行数,m为该三维数组中的每一个二维数组的列数,m和n都是已知的常量),所以三维数组名类型为int*[n][m](不是int***);
int a[2][2] = { 1,2,3,4 };
cout << &a << endl;//a是二维数组名,&a是二维数组名的地址,所以&a指向一整个二维数组(类型为int[2][2]),所以&a的类型为int*[2][2]
cout << a<<endl;//a是二维数组名,是一维数组名的地址,所以a指向一整个一维数组(类型为int[2]),所以a的类型为int*[2]
cout << *a << endl;//a是二维数组名,是一维数组名的地址,所以*a是一维数组名,指向一维数组中的一个元素(类型为int),所以*a的类型为int*
cout << &a[0] << endl;//a[0]是一维数组名,&a[0]是一维数组名的地址,所以&a[0]指向一整个一维数组(类型为int[2]),所以&a[0]的类型为int*[2]
cout << a[0]<<endl;//a[0]是一维数组名,所以a[0]指向一位数组中的一个元素(类型为int),所以a[0]的类型为int*
cout << *a[0]<<endl;//a[0]是一维数组名,所以*a[0]就是(不是指向)一维数组中的一个元素(类型为int),所以*a[0]的类型为int