我们知道,二维数组是一维数组的数组的数组,因此如果我们想要使用指针访问二维数组中的某个元素,就需要首先找到这个元素属于二维数组中的哪一个一维数组,然后再确定这个元素在这个一维数组中的哪个位置即可,即如下形式:
*(*(二维数组指针+行偏移)+列偏移)
上面这个形式是和
二维数组名称[行偏移][列偏移]
等价的。于是习题5-9的程序可以以如下方式进行修改:
(gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC))
#include <stdio.h>
static char daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
/*day_of_year函数:将某月某日的日期表示形式转换为某年中第几天的表示形式*/
int day_of_year(int year,int month,int day){
int i,leap;
leap=year%4==0 && year%100!=0 || year%400==0;
for(i=1;i<month;i++){
day+=*((*(daytab+leap))+i);
}
return day;
}
/*month_day函数:将某年中的第几天的日期表示形式转换为某月某日的表示形式*/
void month_day(int year,int yearday,int *pmonth,int *pday){
int i,leap;
leap=year%4==0 && year%100!=0 || year%400==0;
for(i=1;yearday>*((*(daytab+leap))+i);i++){
yearday-=*((*(daytab+leap))+i);
}
*pmonth=i;
*pday=yearday;
}
int main(){
printf("%d\n",day_of_year(1998,4,8));
int m,d;
month_day(1998,31,&m,&d);
printf("%d,%d\n",m,d);
return 0;
}