两道编程题,思想很重要
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].
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].
相关文章推荐
- 学C++感想:设计思想很重要
- 2016腾讯实习生在线笔试的两道编程题
- CSDN网友:缺陷管理系统很重要,但更重要是管理的思想
- 两道网易ttt编程题
- 十分感谢~ 谁帮我解决一下C++的两道编程题啊
- struts2访问网页元素,Ioc(DI)思想与实现很重要!
- 当当网笔试的两道编程题
- C基础之递归(思想很重要,学会找规律)
- 两道函数式编程题
- [面经]CVTE的两道笔试编程题
- 做程序开发工作,编程思想很重要
- 【放羊的故事】 思想很重要
- HDU 2141 二分查找,实现上简单,思想很重要
- 两道编程题
- 分享两道群硕的笔试编程题——Augmentum笔试归来
- 两道单片机编程题--求最大值和数据传送
- 思想很重要
- 2009年华为软件设计大赛两道编程题
- 两道华为在线编程题
- CSDN网友:缺陷管理系统很重要,但更重要是管理的思想