A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Ye•Ye 中级黑马   /  2014-5-6 10:05  /  1232 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

2 个回复

倒序浏览
首先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: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));
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马