指標實踐(2)
阿新 • • 發佈:2021-01-18
通過指標變數引用陣列元素:
#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;因此指標不難,難的是應用。