黑马程序员技术交流社区

标题: C中数组与指针 [打印本页]

作者: wwpower    时间: 2015-11-27 22:02
标题: C中数组与指针
如int arr[5] = {1,2,3,4,5};
int *p = &arr+1;
*(p-1) = ?
如果 int *p1 = arr+1;
*(p-1)=?
求大牛讲解一下。
作者: IPswhatb“is”    时间: 2015-11-28 00:37
int *p=&arr+1;取的是第五个元素的地址,因为&arr是表示的是数组的地址,&arr+1就是数组的指针向高位跨一步,这一步就是数组的自解释
作者: 石油小硕    时间: 2015-11-28 00:53
本帖最后由 石油小硕 于 2015-11-28 00:56 编辑

&arr是数组的地址,步长为20个字节,+1表示向上移动20个字节,也就是移到了数组第5(数组元素从0开始)个元素(假设有的话)的位置,再减1,就是再向下移动4个字节,即移动到第4个,返回值为5;第二个,arr表示数组第0位元素的地址,加1移动到第1位元素,再减1返回到第0位,所以返回值为1;

作者: IPswhatb“is”    时间: 2015-11-28 01:01
      int *p=&arr+1;取的是第五个元素的地址,因为&arr是表示的是数组的地址,&arr+1就是数组的地址向高位跨一步,这一步就是数组的字节数,数组有五个int类型的元素,所以数组的字节数为20个字节,所以数组要像高位跨20个字节。 那么&arr+1表示的就是在第五个元素之上的一个地址。所以*(p-1)表示的就是第五个元素之上的那个地址向后移动4个字节,刚好走到了第五个元素的空间里。。所以最后输出的结果是5.
    Int *P=arr+1,取的是第二个元素的地址,因为arr==&arr[0]..所以arr+1相当于第一个元素向前跨4个字节,
所以*(P-1)就是第二个元素向地位移动4个字节,最后结果就是1

作者: wwpower    时间: 2015-11-29 16:14
IPswhatb“is” 发表于 2015-11-28 01:01
int *p=&arr+1;取的是第五个元素的地址,因为&arr是表示的是数组的地址,&arr+1就是数组的地址向高位 ...

赞,学习了。
作者: wwpower    时间: 2015-11-29 16:15
石油小硕 发表于 2015-11-28 00:53
&arr是数组的地址,步长为20个字节,+1表示向上移动20个字节,也就是移到了数组第5(数组元素从0开始)个元 ...

谢谢,明白了




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