黑马程序员技术交流社区

标题: 一个c语言指针操作的问题 [打印本页]

作者: Ye•Ye    时间: 2014-5-6 10:05
标题: 一个c语言指针操作的问题
本帖最后由 Ye•Ye 于 2014-5-7 15:33 编辑

谁能告诉我下面这段代码的结果为什么是2和5啊,第一个貌似还能理解,第二个是啥意思啊,*(p-1)不会越界了吗?
main()
{
     int a[5] = {1,2,3,4,5};
     int *p = (int *)(&a+1);
     printf("%d,%d",*(a+1),*(p-1));
}

输出:2,5

作者: 桑托尔    时间: 2014-5-6 10:28
首先a[5] 中,a的含义不仅是数组的名称,同样也是该数组第一个元素的地址,所以*a可以代表a[0]的值,*(a+1)代表 a[1]的值。为2
然后(int*)(&a+1);这个表示指向该数组后的下一个空间,这里面的"+1"就是直接跳过了整个数组。所以*(p-1)是往前倒一位,也就是回到了数组的最后一个值a[4]。答案为5
作者: m573555543    时间: 2014-5-6 17:29
本帖最后由 m573555543 于 2014-5-6 17:37 编辑

main()
{
     int a[5] = {1,2,3,4,5};
//  因为 &a代表了该数的地址。把这个地址加上 +1 表示 跳出 这个地址
     int *p = (int *)(&a+1);
//  现在 *p 的地址已经不在 整型数组a 里面了 。所以 *(p-1)  就是为了让 p 回到这个地址中来。
     printf("%d,%d",*(a+1),*(p-1));
}





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