设为首页 加入收藏

TOP

C语言 指针 地址算数运算 字符指针 指针数组 多维数组 函数指针(四)
2014-11-23 19:55:51 来源: 作者: 【 】 浏览:64
Tags:语言 指针 地址 算数 运算 字符 多维 函数

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
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇深入理解 C 指针阅读笔记 -- 第一.. 下一篇深入理解C语言-08 库函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: