c语言数组首地址的一个疑问

#include<stdio.h>
void main()
{
int a[5];
printf("0x%x,0x%x",a,&a);
}
/*用VC6.0编译,运行结果是0x12ff6c,0x12ff6c。
a是数组的首地址,也就是元素a[0]的存放单元,
而&a是a的地址,a和&a为什么是同一个值呢?难道
说a[0]的值和a的值放在一个内存单元中?*/
难道C语言中常量就不要内存来存放吗?另外,
sizeof(a)=20,而sizeof(&a[0])=4呢?

你可以把数组名看成一个指针啊,只不过数组名不需要再像指针变量那样用一个内存单元存储其地址。
比如:
int n;
int *p=&n;
这里p就需要另外的空间存储。
而数组名的值就是其地址值,所以a和&a相等;
a[0]的值和a的值放在一个内存单元中,这句话是错误的。a[0]的值是第一个数组元素的值,a的值是数组首地址。而a的值不需要用另外的空间存储。
不知道这样说你懂了没?
数组是复合型数据结构,sizeof操作的结果是数组元素占内存的总的字节数。
a不是一个常量,也不是一个变量,只是一个数组标识符。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-16
数组名一般标识数组首个元素所在的内存单元地址,而这样的内存单元地址显然是一个常量。取址运算符应用于变量方有意义,对于常量是没有意义的。&a就相当于&0x12ff6c,这样的运算显然是无效的。一句话,数组名代表着一个不可更改的常量,不论数组元素为什么内容,切记!
第2个回答  2011-02-16
在C语言中,数组名即存放此数组第一个元素的内存地址,一般用十六进制来表示,如上就是
a表示的是a[0]的地址,&是取址运算符,因此对a本身就是一个地址来取址的话没有意义,故也是和a的值一样的。
sizeof(a)指的是数组a中所有元素占的内存空间,由于a定义为int型,一个int元素占4个字节,因此等于20;sizeof(&a[0])指的是首地址占的内存空间,故是等于4.
第3个回答  2011-02-16
因为数组名代表的就是该数组最开始的一个元素的地址, &a = a = &a[0]
相似回答