野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 238884|回复: 836

【每日一题讲解】数组名加减的问题

  [复制链接]
发表于 2013-11-20 00:25:14 | 显示全部楼层 |阅读模式
本帖最后由 山外メ雲ジ 于 2013-11-20 00:31 编辑

  1. //运行以下程序,求运算结果

  2. char a[4]={1,2,3,4};
  3. char *ptr=(int*)(&a+1);
  4. printf("%d",*(ptr-1));

  5. //可供选择的答案:
  6. //A.1
  7. //B.2
  8. //C.4
  9. //D.随机值
复制代码
国际惯例,答案回复可见。我们出题目的目的,是给大家一个思考的机会,不要题目都不去思考,直接看答案哦,那样学不了东西的。
大家回复的时候,把答案也写上去哦。

这题目的关键地方在于这句话:
  1. &a+1
复制代码
大家能不能区分下面这语句和上面那语句的区别:
  1. a+1
复制代码
两者之前的意思是完全不同的,大家看下面代码注释把
  1. int a[4]={1,2,3,4};  // a:数组首元素的首地址,即 a[0];    &a:数组的首地址  
  2. int *ptr=(int*)(&a+1); // a+1:数组的下一元素的首地址,即 a[1];
  3.                        // &a+1:下一数组的首地址,即(int)&a+4*sizeof(int) ,ptr 等效于  &a[4]
  4. printf("%d",*(ptr-1));//ptr-1 就  等效于   &a[3]  ,加上* 取内容,那么结果就是 4
复制代码



回复

使用道具 举报

 楼主| 发表于 2013-11-20 00:29:41 | 显示全部楼层

昨天的题目,大家可以看看结果:

【每日一题讲解】指针操作的问题 - 软件设计区 - 野火初学123论坛 http://firebbs.cn/forum.php?mod=viewthread&tid=1134

ttttttt.jpg
回复 支持 反对

使用道具 举报

发表于 2013-11-20 00:37:23 | 显示全部楼层
回答正确了,看看分析是否我想的那样
回复 支持 反对

使用道具 举报

发表于 2013-11-20 01:04:59 | 显示全部楼层
写的真的很不错
回复 支持 反对

使用道具 举报

发表于 2013-11-20 08:28:07 | 显示全部楼层
基础不牢固呀,学习了
回复 支持 反对

使用道具 举报

发表于 2013-11-20 08:35:54 | 显示全部楼层
走过路过,不能错过
回复 支持 反对

使用道具 举报

发表于 2013-11-20 09:19:30 | 显示全部楼层
走过路过,好好学习C指针
回复 支持 反对

使用道具 举报

发表于 2013-11-20 11:05:15 | 显示全部楼层
答错了 看看解析
回复 支持 反对

使用道具 举报

发表于 2013-11-20 11:08:15 | 显示全部楼层
走过路过,不能错过
回复 支持 反对

使用道具 举报

发表于 2013-11-20 12:59:27 | 显示全部楼层
学习学习!   
回复 支持 反对

使用道具 举报

发表于 2013-11-20 14:14:23 | 显示全部楼层
- - 答对了。。不过看看思路。。
回复 支持 反对

使用道具 举报

发表于 2013-11-20 14:26:41 | 显示全部楼层
学习下,万能的火哥
回复 支持 反对

使用道具 举报

发表于 2013-11-20 14:47:23 | 显示全部楼层
a【4】数组里总共只有四个元素,从a[0]到a[3],a[4]出现在这个过程中不违反规定吗?
回复 支持 反对

使用道具 举报

发表于 2013-11-20 19:15:07 | 显示全部楼层
回答错了,来看看分析过程
回复 支持 反对

使用道具 举报

发表于 2013-11-20 19:50:46 | 显示全部楼层
A走过路过,不能错过
回复 支持 反对

使用道具 举报

发表于 2013-11-20 20:10:06 | 显示全部楼层
难道是A吗?我选的D
回复 支持 反对

使用道具 举报

发表于 2013-11-20 20:15:42 | 显示全部楼层
C。。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-20 23:02:03 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-21 08:19:03 | 显示全部楼层
C:\Users\JudeScorpio\Desktop\QQ图片20131121081626.jpg
问什么在VC6.0编译器下,调试环境中,&a+1 和a+1 的 地址都是一样的?
回复 支持 反对

使用道具 举报

发表于 2013-11-21 08:19:50 | 显示全部楼层
JudeScorpio 发表于 2013-11-21 08:19
问什么在VC6.0编译器下,调试环境中,&a+1 和a+1 的 地址都是一样的?

额,怎么上图?
回复 支持 反对

使用道具 举报

发表于 2013-11-21 10:20:41 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-21 10:21:56 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-21 11:15:47 | 显示全部楼层
答错了。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-21 16:16:45 | 显示全部楼层
我选择的是A   1   错了  不知道原因  求教
回复 支持 反对

使用道具 举报

发表于 2013-11-21 19:29:20 | 显示全部楼层
自己分析了一下感觉是A
可是编程验证后确实C
应该是&a+1的事。不知道这个1,代表多少个地址单元。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2013-11-21 20:24:53 | 显示全部楼层
随机的把  最后是把一个地址 放进去 了啊
回复 支持 反对

使用道具 举报

发表于 2013-11-21 21:58:29 | 显示全部楼层
感谢每日一题学习了
回复 支持 反对

使用道具 举报

发表于 2013-11-21 22:00:15 | 显示全部楼层
答案是4,
回复 支持 反对

使用道具 举报

发表于 2013-11-22 08:43:34 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-22 08:47:25 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-22 09:00:09 | 显示全部楼层
这道题前两天回答了两次都错了,而且发现每次题目都有些差别,昨天数组类型是int a[4];指针类型int *ptr。今天不一样了。
回复 支持 反对

使用道具 举报

发表于 2013-11-22 09:45:00 | 显示全部楼层
天天都在打酱油!!
回复 支持 反对

使用道具 举报

发表于 2013-11-22 11:15:15 | 显示全部楼层
又错了555555555555555555555555
回复 支持 反对

使用道具 举报

发表于 2013-11-22 11:44:47 | 显示全部楼层
为啥不是A啊。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-22 11:53:50 | 显示全部楼层
火哥每天这里都能收到益处我刚学c语言,每天早上起来第一件事就是看一看每日一题然后路上想嘻嘻嘻
回复 支持 反对

使用道具 举报

发表于 2013-11-23 11:09:15 | 显示全部楼层
我选的B,不会做啊!!
回复 支持 反对

使用道具 举报

发表于 2013-11-23 13:42:15 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-23 15:24:30 | 显示全部楼层
真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2013-11-23 15:47:13 | 显示全部楼层
1    我不知道取地址的运算优先极是不是要大于加号,我选a首地址+1,*ptr=2   *(ptr-1)=1,所以选A
回复 支持 反对

使用道具 举报

发表于 2013-11-23 15:52:24 | 显示全部楼层
能不能再解释的详细一点,完全不懂
回复 支持 反对

使用道具 举报

发表于 2013-11-25 08:52:42 | 显示全部楼层
D,&a+1是把地址往后移动了一个字节,然后强制转换成指向int类型的指针,然后将指针减去一个int类型的长度,就是4,所以答案是随机的
回复 支持 反对

使用道具 举报

发表于 2013-11-25 12:52:24 | 显示全部楼层
STC89C52 发表于 2013-11-22 11:53
火哥每天这里都能收到益处我刚学c语言,每天早上起来第一件事就是看一看每日一题然后路上想嘻嘻嘻

我们的论坛就是专为初学者而生
回复 支持 反对

使用道具 举报

发表于 2013-11-25 13:05:48 | 显示全部楼层
yukaigogogo 发表于 2013-11-23 15:52
能不能再解释的详细一点,完全不懂

a 是 (char*) 类型的
&a 是 char (*)[4] 类型的

a + 1 就是 (int)a + sizeof(char) = a 的地址值 加 1 ,即 a[1] 的地址
&a + 1 就是 (int)a + sizeof(char (*)[4] ) = a的地址值 + 4*1 ,即 a[5] 的地址
回复 支持 1 反对 0

使用道具 举报

发表于 2013-11-25 13:16:38 | 显示全部楼层
JudeScorpio 发表于 2013-11-21 08:19
问什么在VC6.0编译器下,调试环境中,&a+1 和a+1 的 地址都是一样的?

图片不能直接复制过来,要 点击上面的上传图片工具(切换到高级模式)

在调试界面,确实看到的值不对(脱离了上下文,导致无法识别真正的类型)。不过,你看真正的赋值,结果就出来

222222.jpg
回复 支持 反对

使用道具 举报

发表于 2013-11-26 16:57:55 | 显示全部楼层
B吧...少于10字符- -
回复 支持 反对

使用道具 举报

发表于 2013-12-2 11:00:11 | 显示全部楼层
抢沙发~我来顶楼主的抢沙发~我来顶楼主的
回复 支持 反对

使用道具 举报

发表于 2013-12-13 14:19:51 | 显示全部楼层
随机值吧,输出的是a【1】的地址减1 吧
回复 支持 反对

使用道具 举报

发表于 2013-12-20 12:56:32 | 显示全部楼层
选择D。输出指针指向对象的长度变了
回复 支持 反对

使用道具 举报

发表于 2013-12-24 17:07:38 | 显示全部楼层
学习了真棒!!非常感谢真棒!!非常感谢真棒!!非常感谢真棒!!非常感谢
回复 支持 反对

使用道具 举报

发表于 2014-1-7 08:55:13 | 显示全部楼层
逻辑上认为是4,即答案为C,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 20:48 , Processed in 0.072453 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表