(2). 方法二 -- 用数组存储各月的日期(妙呀~):
//描述 //KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。 //输入描述: //多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。 //输出描述: //针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。 #include <stdio.h> //平年: // 1 2 3 4 5 6 7 8 9 10 11 12 // 31 28 31 30 31 30 31 31 30 31 30 31 // //闰年: // 1 2 3 4 5 6 7 8 9 10 11 12 // -- 29 -- -- -- -- -- -- -- -- -- -- // 1 3 5 7 8 10 12 -- 31天 // 4 6 9 11 -- 30天 // 2月 特殊 int get_days_of_month(int y, int m) { int d = 0; int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; // 0 1 2 3 4 5 6 7 8 9 10 11 12 //使用一个数组把 日期 放进去,把第一个元素随便设置, //让1月下标为1,2月下标为2,以此类推 d = days[m]; //刚好传进来的月份对应数组中的月份下标 if (((y%4==0 && y%100!=0) || (y%400==0)) && m==2) //如果是闰年 并且 月份是2月 { d += 1;//在平年2月的基础上再加1变成29日 } return d; } int main() { int y = 0;//年 int m = 0;//月 //多组输入: while (scanf("%d %d", &y, &m) == 2) { int d = get_days_of_month(y, m); //写个函数计算该年该月的日期, //参数为 y 和 m //返回值为 对于日期 printf("%d\n", d); } return 0; }
3. 使用指针打印数组内容
(1). 方法一 -- 用for循环进行循环打印:
//使用指针打印数组内容 #include <stdio.h> int main() { float arr[] = { 3.14f, 99.9f, 66.5f, 0.0f }; float* p = arr; //把数组名(首地址)放进指针中 int sz = sizeof(arr) / sizeof(arr[0]); //元素个数 //使用指针打印数组内容 int i = 0; for (i = 0; i < sz; i++) { printf("%f ", *p); p++; } return 0; }
(2). 方法二 -- 用while循环进行循环打印:
//使用指针打印数组内容 #include <stdio.h> int main() { float arr[] = { 3.14f, 99.9f, 66.5f, 0.0f }; float* p = arr; //把数组名(首地址)放进指针中 int sz = sizeof(arr) / sizeof(arr[0]); //元素个数 float* q = arr + sz; //使用指针表示元素个数 //使用指针打印数组内容 while (p < q)//对比地址大小来判断用不用打印 { printf("%f ", *p++);//先解引用再p++ } return 0; }
(3). 自定义函数用while循环进行循环打印:
//使用指针打印数组内容 #include <stdio.h> void print(float* p, int sz) { float* q = p + sz; //使用指针表示元素个数 //使用指针打印数组内容 while (p < q)//对比地址大小来判断用不用打印 { printf("%f ", *p++);//先解引用再p++ } } int main() { float arr[] = { 3.14f, 99.9f, 66.5f, 0.0f }; float* p = arr; //把数组名(首地址)放进指针中 int sz = sizeof(arr) / sizeof(arr[0]); //元素个数 print(arr, sz); //调用自定义函数 return 0; }
4. 使用指针使字符串逆序
//字符串逆序 #include <stdio.h> #include <string.h> int main() { char arr[10001] = { 0 }; gets(arr);//输入数组数据,gets可以把空格也读入 int len = strlen(arr); //进行逆序:使用 left 和 right char* left = arr; //左指针 char* right = arr + len - 1; //右指针 while (left < right)//两指针中间还有值就继续换 { char tmp = *left; *left = *right; *right = tmp; left++; right--; } printf("%s\n", arr); return 0; }
补充:
- 32位系统下:
int占4个字节,指针表示地址空间个数,总共有2^32个,故占4个字节
- 64位系统下:
int占4个字节,指针表示地址空间个数,总共有2^64个,故占8个字节
- 整型指针+1,是向后偏移一个整型
- 指针 - 指针 得到的是 指针和指针之间的元素个数
- 指针就是地址,指针比较大小,就是地址比较大小,地址也是有大小之分的