黑马程序员技术交流社区

标题: 一道C语题做错后的探究 [打印本页]

作者: 13673696542    时间: 2015-3-31 14:42
标题: 一道C语题做错后的探究
一道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(等于数组长度)
从以上数据可以验证之前的假想是正确的,希望这点分析能对大家有些帮助。


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

是的,这也是C能控制底层的好处,任何事都是双刃剑合理利用就好。
作者: 13673696542    时间: 2015-3-31 17:19
kim55666 发表于 2015-3-31 16:56
真巧,我刚才也看见这题了

呵呵,那就共同学习吧!
作者: 13673696542    时间: 2015-3-31 17:21
hellooc 发表于 2015-3-31 16:31
指针的东西真的不好确定会出现什么结果,不确定的话先试一试

嗯,我就是试出来的,上面的地址值就是在windows里测试的结果。
作者: 13673696542    时间: 2015-3-31 17:23
oucding 发表于 2015-3-31 16:07
看样子指针指一块我还得复习一下,网的有点快

确实,我的指针学的也头疼,不过多想想为什么是好事帮助学习。
作者: 锵锵来跳鱼    时间: 2015-3-31 19:56
学习了,虽然没碰见这样的题目
作者: 游戏龙    时间: 2015-3-31 20:45
谢谢分享
作者: 流转少年    时间: 2015-3-31 22:01
学习了,楼主好人:handshake
作者: So然后    时间: 2015-4-1 09:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: wzboy    时间: 2015-4-1 09:50
这个帖子该给技术分的。
作者: chnvi    时间: 2015-4-1 10:30
回头复习复习




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