<怎麼設計一個函數?> 中代碼的指針實現

<怎麼設計一個函數?> 中代碼的指針實現

接下來對「怎麼設計一個函數」部分編寫代碼進行指針實現,藉此介紹利用指針訪問一維數組的方法。學習過指針後,大家都知道指針就是變數的內存地址,指針變數就是用於存儲變數或函數的內存地址的特殊類型的變數。因此,可以通過指針的間接訪問來操作其他變數、數組等對應的內存空間。

數組是相同類型的元素的集合,數組中各元素在內存中的地址是連續的,因此可以使用指針變數來訪問數組中的元素。同時,數組名的值為數組中第0個元素的首地址,也就是說,對於數組int a[5]來說,a=&a[0],但是,需要特別指出的是,a是只讀的,不能通過a++,或者a=b等表達式修改a的值。但是,可以把a的值賦予指針變數p(int *),p=a,這樣,p就指向了數組a的第0個元素,使用*p=5就能夠把a[0]元素的值改為5;而p的值是可以變化的,執行一次p++後,p指向數組中的下一個元素a[1],執行n-1(n是數組a中元素的個數)次後就指向數組a的最後一個元素a[n-1],再執行p++,將超出數組的範圍,越界訪問。

(1)input函數的指針實現

input函數的原型初步設計為:void input(int a[],int n),此時形參a的類型為數組類型,但是C語言中,並不會為a根據元素的個數分配對應的連續內存空間,而只將a作為一個指向該類數組類型的指針變數來進行處理。這樣當在主調函數main中利用input(a,n);調用函數input時,會將main函數中數組a的地址賦予input函數的形參a,這樣input函數中的局部變數a指向main中數組a的首個元素。也就是說,這裡int a[]可以等價於 int *a. 可以利用一個整型指針變數q來遍歷從p指向的位置開始的n個數據元素。當q的初始值為p,也就是指向p所指向的內存,讀取鍵盤輸入的一個整數值,存入q指向的內存區域,然後使q指向下一個元素,循環往複,直至q的值等於p+n時。具體代碼修改為:

void input(int *p,int n ){ int *q=p; while(q<p+n) scanf("%d",q++);}

(2)average函數的指針實現

在average函數中,保留形參是數組類型,在函數中利用指針變數p來完成n個元素的訪問。過程和上面的函數一樣,不再贅述。

double average(int a[],int n){ int *p=a; double avg=0; while(p<a+n) avg+=*(p++); return avg/n;}

(3)filter函數的指針實現

int filter(int a[],int n,int b[]){ double avg=average(a,n); int *p,*q; for(p=a,q=b;p<a+n;p++) { if(*p>avg) *q++=*p; } return q-b;}

(4)output函數的指針實現

以下三種方法都可以實現:

void output(int a[],int n){ int i; for(i=0;i<n;i++) printf("%d ",*(a+i));//利用數組名間接訪問 printf("
");}void output(int *p,int n){ int i; for(i=0;i<n;i++) printf("%d ",*(p+i));//利用指針訪問 printf("
");}void output(int a[],int n){ int *p; for(p=a;p<a+n;p++) printf("%d ",*p);//利用指針變數訪問 printf("
");}

(5)main函數調用代碼的優化:

int main(){ int a[50],n; double avg; while(~scanf("%d",&n)) { input(a,n); avg=average(a,n); printf("%.2lf
",avg); n=filter(a,n,a); (n==0)?printf("no
"):output(a,n); } return 0;}

推薦閱讀:

okhttp support 307 redirect for palo
假如你可以個人主導 C++,你打算怎樣裁剪、擴充和訂製 C++ 來達到你心中最完美的 C++?
史上最全的數控G代碼編程詳解—你收藏了嗎?
0基礎學Python之十五:字典(上)
Python分詞模塊jieba (01)-jieba安裝,分詞,提取關鍵詞,自定義分詞,切換詞庫講解

TAG:代碼 | 指針編程 | 編程 |