C语言数组名和多重指针的区别

取地址数组名和数组首元素的地址虽然数值都相同,区别是编译器记录的信息不同,取地址数组名取出的是整个数组的地址,可以由数组指针保存,而它自增1就会跨过整个一维数组的大小,首元素地址自增只是迈向1个元素的长度。无论二维数组还是三维数组,他的数组名的值为何与首元素地址相同?这是因为数组名是指针常量,作数值的记录,最终地址由各维下标乘以对应级别的字节大小然后累加,再加上数组名地址。如果用一个数组指针变量来存储数组的地址,比如

int arr[3][5];

int(*p)[5]=arr;那么这个数组指针p的地址就跟数组地址不同了,因为数组名跟多重指针不同,多重指针每个层级的地址都不同,是一个指针变量保存着另外更低级的指针的地址,而那个指针存放的地址解引用又对应着另外的指针。但是多维数组的数组名他不是一级保存着下一级的逻辑关系,仅仅是表示索引后他是属于多少个元素的数组指针,他在多少维,而不是解引用跳转到该地址去找指针。

数组作为函数形参时会退化一级,即:一维整形数组退化成整形指针,二维数组变成一维数组指针,三维数组解析成二维数组指针。所以假如void sort(int arr[5])这样说明数组大小也没用,但是当参数是int a[5][4]这时候4不可省略,5可以省略,也可以换成int (*a)[4]这种写法。

你可能感兴趣的:(c语言)