免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2542 | 回复: 8

[C] 用指针计算元素在数组中的位置。是我理解错了,还是答案有误? [复制链接]

论坛徽章:
0
发表于 2014-11-19 09:39 |显示全部楼层

  1. /*month_day:将某年中第几天(yearday)的日期,转化为某月某日的形式*/
  2. static char daytab[2][13] =                         /*用二维数组定义月份*/
  3. {
  4.      {0,31,28,31,30,31,30,31,31,30,31,30,31},
  5.      {0,31,29,31,30,31,30,31,31,30,31,30,31}         
  6. };


  7. int month_day(int year ,int yearday ,int *pmonth ,int *pday)
  8. {
  9.         int leap,*p;
  10.         leap = year % 4 ==0 && year % 100 == 0 || year % 400 == 0;   /*计算是否是闰年,闰年是1,非润是0*/
  11.         p = daytab[leap];                        /*p指向daytab[leap]的首地址  (daytab[leap]有13个元素) */
  12.        
  13.         while( yearday > *++p)    /*天数yearday大于++p的值(下月天数),则减下月天数*/
  14.         {
  15.                 yearday -= *p ;
  16.         }
  17.         *pmonth = p -*(daytab +leap);          /*???*/
  18.         *pday = yearday;

  19. }
复制代码
我卡壳的地方是: *pmonth = p -*(daytab +leap);

daytab是daytab[leap]首地址,daytab +leap 是daytab[leap]地址,所以,*(daytab +leap)是daytab[leap]的元素的值了。p是daytab[leap]中某个元素地址,p怎么能和*(daytab +leap)相减呢??

计算yearday对应的月份,要用 *pmonth = p -(daytab +leap);  才对呀?

是我哪个地方理解不对,还是答案错了。求大侠帮忙解答下,谢谢。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
发表于 2014-11-19 10:23 |显示全部楼层
static char daytab[2][13] =
int leap,*p;

论坛徽章:
0
发表于 2014-11-19 10:38 |显示全部楼层
super皮波 发表于 2014-11-19 10:23
static char daytab[2][13] =
int leap,*p;


木有明白哇。。( ⊙o⊙ )

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2014-11-19 11:05 |显示全部楼层
先说一句:2楼说的错误要改掉

p 的类型是 char*
(daytab +leap) 的类型是 char (*)[13]
类型都不一样怎么可以相减?

p 的类型是 char*
*(daytab +leap) 的类型是 char [13]
数组可以隐式降阶为指针,即 char [13] 可以隐式降阶为 char* // 比如 int a[10]; int* p = a;
类型一致,这就可减了

论坛徽章:
0
发表于 2014-11-19 13:29 |显示全部楼层
bruceteen 发表于 2014-11-19 11:05
先说一句:2楼说的错误要改掉

p 的类型是 char*


参考了下谭浩强的绿皮书,发现:
daytab +leap和*(daytab +leap)都是指针,它们的值相同,指向同一地址,但是指针的类型不同。一个从行的角度,一个从列的角度。

所以, *pmonth = p -(daytab +leap);  和 *pmonth = p -*(daytab +leap); 应该都是对的。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
发表于 2014-11-19 13:53 |显示全部楼层
你闰年判断有错误

论坛徽章:
0
发表于 2014-11-19 14:06 |显示全部楼层
回复 6# vbs100

哈,看出来了。 year % 100 != 0

   

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
发表于 2014-11-19 15:45 |显示全部楼层
指针类型不同,不能相减。不要光关注变量的值,类型也很重要。

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
发表于 2014-11-20 18:21 |显示全部楼层
static char daytab[2][13]

改为static int daytab[2][13]

*pmonth = p -*(daytab +leap);

改为*pmonth = p -(int *)(daytab+leap);

另外,在主函数中记得为指针申请空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP