您的位置:首页 > 编程语言

两道编程题,思想很重要

2010-03-12 21:04 267 查看
用户输入年月日,计算该日是该年的第几天并输出
int days(int y, int m, int d)
{
/* 数组mt存放各月天数 */
int n=0,mt[ ]={31,28,31,30,31,30,31,31,30,31,30,31};

if (LEAP_YEAR(y)) mt[2]=29; /* 若是闰年修正2月份天数 */
for(i=1;i<m;i++) n+=mt[i]; /* 累加该月前各个月天数 */
n+=d; /* 补加上该月至该日的天数 */

return n;

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

输出结果是什么?

  答案:输出:2,5

  *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
  &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
  int *ptr=(int *)(&a+1);
  则ptr实际是&(a[5]),也就是a+5
  
  原因如下:

  &a是数组指针,其类型为 int (*)[5];
  而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
  a是长度为5的int数组指针,所以要加 5*sizeof(int)
  所以ptr实际是a[5]
  但是prt与(&a+1)类型是不一样的(这点很重要)
  所以prt-1只会减去sizeof(int*)

  a,&a的地址是一样的,但意思不一样
a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: