五、无论二维数组还是三维数组,他的数组名的值为何与首元素地址相同?这是因为数组名是指针常量,作数值的记录,最终地址由各维下标乘以对应级别的字节大小累加最后加上数组名地址。取地址数组名和数组首元素的地址虽然数值都相同,区别是编译器记录的信息不同,取地址数组名取出的是整个数组的地址,比数组名高一维度,可以赋值给该数组大小的数组指针。一维数组指针自增1就会跨过整个一维数组的大小,数组名加1只是迈向1个元素的长度。如果用一个数组指针来存储数组的地址,比如
int arr[3][5];
int(*p)[5]=arr;那么这个p的地址(&p)就跟数组首元素地址不同了,因为数组名跟多重指针不同,多重指针每个层级的地址都不同,是一个指针变量保存着另外更低级的指针的地址,而那个指针存放的地址解引用又对应着另外的指针。但是多维数组的数组名他不是一级保存着下一级的逻辑关系,仅仅是表示索引后他是属于多少个元素的数组指针,他在多少维,而不是解引用跳转到该地址去找指针。
数组作为函数形参时会退化一级,即:一维整形数组退化成整形指针,二维数组变成一维数组指针,所以假如void sort(int arr[5])这样说明数组大小也没用,但是当参数是int a[5][4]这时候4不可省略,5可以省略,也可以换成int (*a)[4]这种写法。