一文搞懂C语言数组的地址和首元素地址区别,以及易混淆成多重指针。

无论二维数组还是三维数组,他的数组名的值为何与首元素地址相同?这是因为数组名是指针常量,记录着地址值,数组是连续的空间,首元素地址就是数组的地址。取地址数组名和数组首元素的地址虽然数值都相同,区别是编译器记录的信息不同,取地址数组名取出的是整个数组的地址,比数组名高一维度,可以赋值给该数组大小的数组指针。一维数组指针自增1就会跨过整个一维数组的大小,数组名加1只是迈向1个元素的长度。数组名不是多重指针,创建一个二维数组arr[5][4],调用时arr[2][3]最终地址由各维下标乘以对应级别的字节大小累加最后加上数组名地址。而多重指针访问元素时不同,int a=8;int *p1=&a,int **p2=&p1;多重指针每个层级的地址都不同,是一个指针变量保存着另外更低级的指针的地址,如p1保存着a的地址,但p1作为变量也有地址,被更高级的p2保存着。多维数组的数组名他不是一级保存着下一级的逻辑关系,仅仅是表示索引后他是属于多少个元素的数组指针,他在多少维,而不是解引用跳转到该地址去找指针。

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

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