问答题 a是数组,(int*)(&a+1)表示什么意思
【正确答案】
【答案解析】对于数组而言,一个数组名代表的含义是数组中第一个元素的位置,即地址,通过数组名可以访问该数组。程序示例如下:
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int b[100]
int *ptr=(int*)(&a+1);
printf("%d/n%d/n",*(a+1),*(ptr-1));
printf("sizeof(b)=%d/n",sizeof(b));
printf("sizeof(&b)=%d/n",sizeof(&b));
return 0;
}
程序输出结果:
2
5
slzeot(b)=400
sizeof(&b)=400
一般而言,对指针进行加1操作,得到的将是下一个元素的地址,一个类型为T的指针移动,是以sizeof(T)为移动单位,如果ptr=a+1,那么最终输出*(ptr-1)的值肯定是2,1。而ptr=&a+1,输出则变为2,5。&a是数组指针,是一个指向int(*)[5]的指针,但是这时候ptr相当于int *[5],也就是指向了一个含有5个元素的数组,这也就不难解释为什么第二个打印出来&b的大小也是400了,sizeof(b)打印出来的是b数组的大小。sizeof(&b)同样也是。&a+1的地址是&a地址再加5*sizeof(int);它的运算单位是int(*)[5]。
需要注意的是,数组的首地址与数组元素的首地址的问题,两者虽然值相等,但是意义却不相同,a[0]是一个元素,a是这个数组,虽然&a[0]和&a的值一样,前者是数组首元素的首地址,后者是数组的首地址。
ptr-1的单位是ptr的类型,因此ptr-1的位置刚好是a[4],它在内存中的分布位置是和&a+1相邻的。但是ptr与(&a+1)类型是不一样的,所以ptr-1只会减去sizeof(int*)。值得注意的是,a和&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址;&a是对象(数组)首地址;a+1是数组下一元素的地址,即a[1];而&a+1是下一个对象的地址,即a[5]。
数组下标取负值的情况:
#include<stdio.h>
int main()
{
int a[5]={0,1,2,3,4};
int* p=&a[4];
for(int i=-4;i<=0;i++)
{
printf("%d%d/n",p[i],&p[i]);
}
return 0;
}
程序输出结果如下:
0 1310572
1 1310576
2 1310580
3 1310584
4 1310588
从上例可以发现,在C++中,数组的下标并非不可以为负数,当数组下标为负数时,编译可以通过,而且也可以得到正确的结果,只是它表示的意思却是从当前地址向前寻址,即为当前地址减去sizeof(类型)的地址值。