代码:
int main()
{int a[10]={1,2,3,4,5,6,7,8,9,10};
cout<<a<<"\t"<<&a<<endl;
cout<<a+1<<"\t"<<&a+1<<endl;
return 0;
}
结果:
我们知道数组名与数组名取地址所得到的地址都是一样的,由第一行的输出可以验证这一结论。那么如果都在这基础上加上指针运算呢,一开始我也觉得结果是相同的,但事实是让我懵逼的。由第二行输出可以知道a+1后指针指向的是组的第二个元素,而&a+1后指针指向的是整个数组内存空间的末尾。这是为什么呢?这到底是a的心灵的扭曲还是&a道德的沦丧?
言归正传。。
由于数组和指针的关系,a相当于一个指针,指向的是第一个元素,也就是传说中数组的首地址。此时这个指针的步长是数组元素类型所占的字节数,在此为4B。而&a这货代表的不是a这个变量的地址,而是数组元素的地址,它代表整个数组!!所以&a这个指针的步长是整个数组所占的字节数!!也就是说a的类型是int[10],&a的类型是int(*)[10],是个指向int[10]数组的指针,&a[0]的类型是int*。