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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 13673696542 中级黑马   /  2015-3-31 14:42  /  1464 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一道C语题做错后的探究

本人先声明自己是菜鸟,也不是学计算机专业的(我的专业是法律)。可能以下内容有错误,如有请大神指正,小弟将感激不尽。
我有网上看到一道题内容如下:
inta[5]={1,2,3,4,5};
int*ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
A  12
B  25
C  21
D  15

刚开始时我觉得这个应该选C,但是我错了,这道题应该选B。看了别人的答案才知道ptr 指向的是数组a最后一个元素的下一个元素,这让我很意外。通过我对数组和指针的认识并作了一个假想现已验证假设是正确的。

假想:对于这个数组*(&a+1)为这数组最后一个元素的下一个元素,*(&a+2)为2个数组长度的下一个元素,*(&a+3)为3个………………
之所以有这样的假设是受*(a+1)是数组下一个元素的启发。因为数组是int型的,所以(a+1)时指针就移动4个字节。那么(&a+1)时指针就移动一个数组的长度。

验证:先设定一段代码去验证这个假想。
#include<stdio.h>
Int main()
{
      int a[5]={1,2,3,4,5};
      print(“这个数组的长度为:%d\n”,sizeof(a));
      print(“数组第一个元素地址为:%p\n”,&a);
      print(“(&a+1)时指针移动到:%p\n”, (&a+1));
      print(“(&a+2)时指针移动到:%p\n”, (&a+2));
      print(“(&a+3)时指针移动到:%p\n”, (&a+3));
      print(“(&a+4)时指针移动到:%p\n”, (&a+4));
return 0;
}

打印出后的结果为:
这个数组的长度为:20
数组第一个元素地址为:0012ff4c
(&a+1)时指针移动到:0012ff60
(&a+2)时指针移动到: 0012ff74
(&a+3)时指针移动到:0012ff88
数组第一个元素地址为:0012ff4c     转换10进制    1245004
(&a+1)时指针移动到:0012ff60       转换10进制   1245024
(&a+2)时指针移动到:0012ff74       转换10进制    1245044
(&a+3)时指针移动到:0012ff88       转换10进制   1245064
1245024-1245004=20(等于数组长度)
1245044-1245024=20(等于数组长度)
1245064-1245044=20(等于数组长度)
从以上数据可以验证之前的假想是正确的,希望这点分析能对大家有些帮助。

15 个回复

倒序浏览
楼主写的很好啊  这个我以前也注意过 还是挺危险的  c语言中数组允许越界访问
回复 使用道具 举报
看样子指针指一块我还得复习一下,网的有点快:(
回复 使用道具 举报
指针的东西真的不好确定会出现什么结果,不确定的话先试一试
回复 使用道具 举报
真巧,我刚才也看见这题了
回复 使用道具 举报
楼主分析的很好,感谢分享
一开始也以为答案是 2,1,看过lz的分析后才惊觉,如果是int*ptr=(int*)(a+1);的话,答案才是 2,1,但是这题是直接移动数组长度,答案大不一样啊,受教了
回复 使用道具 举报
PHXmilan 发表于 2015-3-31 14:54
楼主写的很好啊  这个我以前也注意过 还是挺危险的  c语言中数组允许越界访问 ...

是的,这也是C能控制底层的好处,任何事都是双刃剑合理利用就好。
回复 使用道具 举报
kim55666 发表于 2015-3-31 16:56
真巧,我刚才也看见这题了

呵呵,那就共同学习吧!
回复 使用道具 举报
hellooc 发表于 2015-3-31 16:31
指针的东西真的不好确定会出现什么结果,不确定的话先试一试

嗯,我就是试出来的,上面的地址值就是在windows里测试的结果。
回复 使用道具 举报
oucding 发表于 2015-3-31 16:07
看样子指针指一块我还得复习一下,网的有点快

确实,我的指针学的也头疼,不过多想想为什么是好事帮助学习。
回复 使用道具 举报
学习了,虽然没碰见这样的题目
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
学习了,楼主好人:handshake
回复 使用道具 举报
So然后 2015-4-1 09:11:13
14#
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
这个帖子该给技术分的。
回复 使用道具 举报
回头复习复习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马