黑马程序员技术交流社区

标题: C指针问题 [打印本页]

作者: 默默者    时间: 2014-4-27 22:01
标题: C指针问题
为什么下面代码的第二个输出是5,求解答一下。
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
NSLog(@"%d,%d", *(a+1), *(p-1));
作者: 魅影穿眸    时间: 2014-4-27 22:06
int *p = (int*)(&a+1);  // &a的类型是int[5],所以&a+1是要加上一个a[5]的大小,也就是5*sizeof(int),所以pa指向a[5]的位置
pa指向a[5],所以*(pa-1)是a[4]即是5
作者: Freedam    时间: 2014-4-27 22:24
int *p = (int *)(&a+1)中的&a是对整个数组a取地址和&a[0]取数组的首地址不一样。
&a[0]取的是数组的首地址,&a[0]+1取的是数组的第二个元素的地址。
但是&a取的是整个数组所存的地址,因此&a+1取的的是整个数组的存储空间的下一位地址也就是数组第五个元素的下一位。所以p的地址就在数组a[5]之后。又因为&a是整型数组a的地址,+1就是与数组a对应的下一个数组的存储空间,将&a+1强制转换成整型指针赋值给整型指针p,这时的p指针加1或是减1就是对整型变量这么大的存储空间寻址。也就是意味着p+1就是指向与p相距4个字节远的地址,p-1就是指向p的上一个整型变量的地址。因为p指向a[5]的下一位,那么p-1就是指向a[5],p-1就是a[5]的地址,所以输出结果为5




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2