C语言——数组名、取数组首地址的区别(1)

(1)可以发现array和&array的值是一样的,都是0012FF34。对array+1,结果不是简单的加法那样,即并不是0012FF35,而是0012FF38;由于array[0]和array一样,都是数组首元素的首地址,+1后的结果相同。然而,&array+1的结果却是0012FF48。另外,分别对array和&array求字节长度发现是一样的(结果20是一个十进制数)。

(2)这里会涉及到一下几点知识:

    • 一般情况下声明一个数组之后,比如int array[5],数组名array就是数组首元素的首地址,而且是一个地址常量。但是,在函数声明的形参列表中除外。
    • 在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》
    • 在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。——《C和指针》
    • “+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位。
      即array+1:在数组首元素的首地址的基础上,偏移一个sizeof(array[0])单位。此处的类型T就是数组中的一个int型的首元素。由于程序是以16进制表示地址结果,array+1的结果为:0012FF34+1*sizeof(array[0])=0012FF34+1*sizeof(int)=0012FF38。
      即&array+1:在数组的首地址的基础上,偏移一个sizeof(array)单位。此处的类型T就是数组中的一个含有5个int型元素的数组。由于程序是以16进制表示地址结果,&array+1的结果为:0012FF34+1*sizeof(array)=0012FF34+1*sizeof(int)*5=0012FF48。注意1*sizeof(int)*5(等于00000014)要转换成16进制后才能进行相加。
上一篇:C程序中与内存有关的常见错误


下一篇:【进阶C语言】指针和数组的巩固练习(sizeof)和(strlen)