假设声明了一个数组a,则&a表示数组a的首地址,a与&a[0]表示数组a首元素的首地址,那么&a+1与a+1有哪些区别呢?通过下面的实验来说明。
int i = 0;
int a[5]={1,2,3,4,5};
int *p = (int *)(&a+1);
for(i=0;i<5;i++)
{
printf("a+%d = 0x%p,a[%d] = %d\n",i,a+i,i,a[i]);
}
printf(" a = 0x%p,&a = 0x%p,&a+1 = 0x%p\n",a,&a,&a+1);
printf("a+1 = 0x%p,*(a+1) = %d,p-1 = 0x%p,*(p-1) = %d\n\n",a+1,*(a+1),p-1,*(p-1));
上述程序首先声明数组a,包含5个元素,然后打印输出数组中每个元素的地址和内容;接着比较&a+1与a+1的区别。
int *p = (int *)(&a+1); ------声明指针p指向的地址
printf(" a = 0x%p,&a = 0x%p,&a+1 = 0x%p\n",a,&a,&a+1); ------分别 a,&a,&a+1的地址。
printf("a+1 = 0x%p,*(a+1) = %d,p-1 = 0x%p,*(p-1) = %d\n\n",a+1,*(a+1),p-1,*(p-1)); ----分别输出a+1,*(a+1),p-1,*(p-1)
调试过程中局部变量地址及内容如下:
调试结果如下:
通过以上结果分析如下:
(1)int *p = (int *)(&a+1);&a表示数组a的首地址0x0012ff44,p的地址为0x0012ff58,p的地址与&a+1的地址相同。
&a+1:取数组a的首地址0x0012ff44,该地址加上sizeof(a)的值,即&a+5*sizeof(int)=0x0012ff44+5*4=0x0012ff44+0x14=0x0012ff58。
p-1=0x0012ff58-sizeof(int)=0x0012ff54=0x0012ff44+0x10=0x0012ff44+4*sizeof(int) ,即p-1与数组元素a[4]的地址相同,*(p-1)= a[4]=5。
(2)*(a+1) a+1是数组a下一个元素的地址,即 &a[1]=0x0012ff44+sizeof(int)=0x0012ff48,即*(a+1)=a[1]=2