通过指针变量引用数组元素:
#include<stdio.h>
int main()
{
int i;
int shu[10];
int *p;
p=shu;
printf("please input ten numbers!\n");
for(i=0;i<10;i++)
scanf("%d",p+i);
printf("and i will output ten numbers....\n");
for(i=0;i<10;i++,p++)
printf("%d",*p);
printf("\n");
return 0;
}
代码感想:
通过此段代码,体现了指针的灵活运用
既然数组名即为地址所以提前做出p=shu是为循环输入每一个数组元素时给每一个元素相应地址,因此在做输入时未添加&
所以当每一个数组元素有了相应地址再依据地址利用取值符号"*"将每一个元素依次输出。
也就是给地址进去取地址寻找。
示例:
输入某年某月某日,计算并输出它是这一年的第几天。
#include<stdio.h>
void datedays(int year,int month,int day,int *p);
int main()
{
int year, month, day,days;
printf("请输入年月日:\n");
scanf("%d-%d-%d",&year,&month,&day);
datedays(year,month,day,&days);
if(days==-1)
printf("你的输入有误,请重新输入!\n");
else
printf("%d-%d-%d是这一年的第%d天!\n",year,month,day,days);
}
void datedays(int year,int month,int day,int *p)
{
int i;
int shu[12]={
31,28,31,30,31,30,31,31,30,31,30,31};
*p=0;
if(year<0||month<=0||month>12)
{
*p=-1;
return;
}
if(year%4==0&&year%100!=0||year%400==0)
{
if(month==2&&day>29)
{
*p=-1;
return;
}
shu[1]++;
for(i=0;i<month-1;i++)
{
*p+=shu[i];
}
}
else
{
if(month==2&&day>28)
{
*p=-1;
return;
}
for(i=0;i<month-1;i++)
{
*p+=shu[i];
}
}
*p+=day;
}
此段代码是基于读懂教材代码的基础上自行码出:其中有基础问题进行阐述。
代码分析:
涉及年份自然判断闰年平年。
计算该日期为这年的第几天,涉及每一个月的天数是不一样的加之闰、平年之分。2月尤为特殊。因此用到平时选择结构,以及选择结构嵌套,之后利用数组对12个月份的天数进行初定义,根据是否为闰年或平年对2月进行操作。
如:
if(year%4==0&&year%100!=0||year%400==0)
{
if(month==2&&day>29)
{
*p=-1;
return;
}
shu[1]++;
for(i=0;i<month-1;i++)
{
*p+=shu[i];
}
这一段子函内容就是这个功能。
这个判断完之后利用循环结构对其所输入月份之前的天数累加求和再加所输入天数即为该日期是该年第几天。
同时代码还穿插了错误输入提示。。。
第一次自行码完后的问题分享:
- 首先学了指针之后该段代码更为简洁易懂(其实不用指针也可以简洁易懂,只是熟悉指针用法而已,嘻嘻嘻)。
- 子函datedys定义了指针变量,要是他能对days取值则需要在调用datedays这个子函时加一个取址符号&,也就是&days
- 在datedays这个子函中预先*p=0;是为了精确输出结果,因此主函数的if语句是写成(days==-1)而不是0;至于为什么,
因为*p会在最终天数得出再与预先设置好的初值进行运算,例如:2020-1-12 本应为第12天若预设初值为-1则为11天,
然而当你想取消这个预设的初值时你会发现所得的输出结果是负数。
也就是这样…
那是因为我们在累加是会先定义sum=0;
指针也是如此:*p其实就是sum;因此指针不难,难的是应用。