数组名,a[] = {1,2,3,4,5}; a 和&a的值是一样的,但是意义不一样。a是数组首元素的地址,而&a是整个数组的首地址。
&a是数组指针,其类型为int(*)[5]。
#include<stdio.h>
int main(int argc, char **argv)
{
int i;
int a[]={1,2,3,4,5};
int s;
int *p = (int *) (&a+1);
printf("a=%p\t&a=%p\n",a,&a);
for(i = 0; i < 5; i++)
{
printf("a[%d] = %p\n", i, &a[i]);
}
printf("p = %p\n&p = %p\ns =%p\n",p, &p, &s);
return 0;
}
输出结果:
a=0xbfa30cc0 &a=0xbfa30cc0
a[0] = 0xbfa30cc0
a[1] = 0xbfa30cc4
a[2] = 0xbfa30cc8
a[3] = 0xbfa30ccc
a[4] = 0xbfa30cd0
p = 0xbfa30cd4
&p = 0xbfa30cd4
s =0xbfa30cd8
![](https://img-my.csdn.net/uploads/201303/03/1362293465_9408.png)
&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。
&a+i = a + i*sizeof(a);
a+i = a +i*sizeof(a[0]);