两道编程题,思想很重要

用户输入年月日,计算该日是该年的第几天并输出

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数组的偏移,是偏移了一个数组的大小(本例是5int

  
int *ptr=(int *)(&a+1);
  则ptr实际是&(a[5]),也就是
a+5
  

  原因如下:


  &a是数组指针,其类型为
int (*)[5];
  而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。

  a是长度为5int数组指针,所以要加
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].

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值