C中,几乎所有的使用数组名的表达式中,数组名是一个指针常量,表示数组中第一个元素的地址,此指针常量的类型取决了数组的类型,如果数组是int型,那么数组名的类型就是“指向int的常量指针”。
但是 数组和指针并不是完全相同的也不是同一个概念。数组有自己独特的属性,如数组具有固定的数量的元素,指针只是一个标量值。数据有确定的长度。编译器使用数组名来记住其数据的属性,只有数组名在表达式中使用的时候,编译器才会产生一个指针常量。生成的只有一个指针常量,而不是指针标量,你不能修改常量的值。因为数组的长度确定的,数组元素所占字节是确定的,所有数组在内存中的位置的相对恒定的。由数组名生成的指针常量表示的是数组第一个元素的位置,也是相对恒定的,不能变化。只有在一种情况下此数组名表示的指针常量才会变化,就是把数组移动到内存的其他位置,实质上这时候,数组已经发生了变化,严格意义上,不是以前的那个数组了。
只有两种情况,数组名不能用指针常量表示:1 数组名作为sizeof的操作符 2. 单目操作符&的操作数。
sizeof返回的是数组的长度,而不是指向数组的指针的长度。