C程序 :
/*************************************************************************
> File Name: multi_array.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月18日 星期二 20时55分07秒
************************************************************************/
#include
/*
* 该二维数组中存放的是 闰年 和 非闰年 每个月的天数
* day_table[1] 中存放的是 非闰年 每个月的天数
* day_table[2] 中存放的时 闰年 每个月的天数
*/
static char day_table[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}
};
/*
* 四年一润, 百年不润, 四百年再润
*/
int leap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
/*
* 遍历每月的月份数, 将每月的天数累加 加上 日的天数
* 得出的结果就是 某日期 在某年的天数
*/
int day_of_year(int year, int month, int day)
{
int i;
for(i = 1; i < month; i++)
day += day_table[leap(year)][i];
return day;
}
/*
* 计算 某年的天数 是具体的 几月几日
* 从 1 开始遍历二维数组的 某一年的月份天数
* 如果 天数 大于 月份天数, 那么 年天数 减去 月份天数, 然后月份自增
* 一直循环到 年天数 小于 月份天数
* 那么此时循环 月份自增的变量就是月份数, 剩余的 年天数就是 日
*
*/
void date_of_year(int year, int year_day, int *pmonth, int *pday)
{
int i, lp;
lp = leap(year);
for(i = 1; year_day > day_table[lp][i]; i++)
year_day -= day_table[lp][i];
*pmonth = i;
*pday = year_day;
}
int main(int argc, char **argv)
{
/*
* 注意指针使用之前一定要初始化, 如果指针不初始化, 就不能使用
* 没有初始化的指针, 不能作为函数的参数
*/
int month, day;
date_of_year(2014, 67, &month, &day);
printf(2014-3-8 is the %d day of the year
, day_of_year(2014, 3, 8));
printf(the 67 day of 2014 is %d month %d day
, month, day);
return 0;
}
执行结果 :
octopus@octopus-Vostro-270s:~/code/c/pointer$ gcc multi_array.c
octopus@octopus-Vostro-270s:~/code/c/pointer$ ./a.out
2014-3-8 is the 67 day of the year
the 67 day of 2014 is 3 month 8 day
二维数组作参数 : 必须声明 列数, 行数可以不进行声明;
-- 函数调用二维数组本质 : 函数调用的传递的是指针, 指针指向一个数组, 这个数组存放的是指针元素, 每个指针都指向一个一维数组;
-- 必须知道一维数组大小 : 传入的只是一个指针, 如何找到数组中的第二个指针呢, 就需要知道一维数组的大小, 传入的指针 加上 一维数组地址 就是 第二个指针的大小, 如果没有一维数组大小, 那么就找不到其它的指针了;
二维数组参数正确声明 :
-- 带所有的参数 : fun(int day_table[2][13]);
-- 带列数, 不带行数 : fun(int day_table[][13]);
-- 指针参数 : fun(int (*day_table)[13]) , 代表参数是一个指针, 这个指针指向一个 由 13个元素组成的一维数组;
-- 错误情况 : fun(int *dat_table[13]) 传入的时一个 存放有 13个指针元素的 一维数组;
-- 错误情况 : fun(int day_table[2][]) 没有列数, 传入的时候只传入了首地址, 无法找到第二个指针;
5. 指针数组初始化
示例代码 :
/*************************************************************************
> File Name: montn_name.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: Wed 19 Mar 2014 12:58:48 AM CST
************************************************************************/
#include
char *month_name(int n)
{
/*
* 初始化指针数组, 指针数组中的元素指向一个字符串
*/
static char *name[] = {
Illegal month,
January, Febrary, March,
April, May, June,
July, August, September,
October, November, December
};
//返回一个指针, 这个指针指向字符串
return (n < 1 || n > 12) name[0] : name[n];
}
int main(int argc, char **argv)
{
printf(month 2 is %s
, month_name(2));
return 0;
}
执行结果 :
[root@ip28 pointer]# gcc montn_name.c
[root@ip28 pointer]# ./a.out
month 2 is Febrary
指针数组初始化 : char *name[] 是一个指针数组, 这是一个一维数组;
-- 指针赋值 : 字符串常量 代表一个指向该常量首地址的指针, 可以将字符串常量赋值给上面的 一维指针数组;
6. 区分指针数组 与 二维数组
举例 :
int array[2][5];
int *arrayp[2];
二维数组 : 上面的 array[2][5] 是二维数组;
-- 空间分配 : 分配了 2 * 5 * sizeof(int) 大小的内存空间;
-- 计算元素地址 : 5 * row + col 是 array[row][col]的地址;
指针数组 : *array[2] 是指针数组;
-- 空间分配 : 分配了10个指针, 没有对指针进行初始化, 必须进行手动初始化, 指针指向的一维数组长度可变, 不固定;
-- 作用 : 指针数组最主要的作用是存放不同长度的字符串;
指针数组示例程序 :
/*************************************************************************
> File Name: montn_name.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: Wed 19 Mar 2014 12:58:48 AM CST
************************************************************************/
#include
char *mon