函數與指針(1)
由於很多同學表示對使用函數和指針總是很困惑,因此這裡特意針對幾個簡單的指針使用進行舉例,便於初學者對比學習使用。
指針是什麼?
簡單的說指針就是內存地址,如果一個變數用來存儲內存地址(如普通變數的內存空間的地址、數組的首地址、函數的內存地址),那麼就需要使用指針類型的變數。
一個指針類型的變數的值表示它指向的內存空間的地址,這個地址中存儲的數據類型就是指針變數的基類型。比如,指針變數p指向一個普通的整型變數,則可以使用以下代碼實現:
int a=5; int *p=&a;
其關係可以表示為:
這樣指針p也就指向了變數a的內存空間,如果需要訪問p指向的內存中的數據,則可以通過*(間接訪問運算符)來進行實現。以下兩行代碼是等價的,其功能是將a的值修改為10:
*p=10; a=10;
乍一看p並沒有什麼優勢,但是你只要想像一下,指針p和變數a如果不是同一個函數的變數,比如:
void test(int *p) { *p=10; } int main() { int a=5; test(&a); return 0; }
這樣就實現了在被調函數test中修改主調函數main中變數a的功能。這裡test函數定義了一個指針類型的形參p,用來接收主調函數傳來的變數a的地址,這樣我們就可以在test函數中通過間接訪問p來實現修改main中a的功能了。
比如指針的一個常見的使用例子:
#include <stdio.h>#include <stdlib.h>#include <string.h>void swap(int *,int *);int main(){ int a=5,b=10; printf("a=%d,b=%d
",a,b); swap(&a,&b); printf("a=%d,b=%d
",a,b); return 0;}void swap(int *pa,int *pb){ int t=*pa;*pa=*pb;*pb=t;}
在以上的例子中,swap函數的兩個形參pa和pb可以接收兩個整型變數的地址,並通過間接訪問的方式修改了它指向變數的值。在main函數中調用swap時,提供的實參分別為&a,&b,這樣就實現了pa=&a,pb=&b的賦值過程,這樣在swap函數中就通過*pa修改了a的值,通過*pb修改了b的值。因此,如果需要在被調函數中修改主調函數中變數的值,就需要經過以下幾個步驟:
- 定義函數的形參必須為指針類型,以接收主調函數中傳來的變數的地址;
- 調用函數時實參為變數的地址;
- 在被調函數中使用*間接訪問形參指向的內存空間,實現修改主調函數中變數值的功能。
指針作為函數的形參的另一個典型應用是當函數有多個返回值的情形。比如,需要在一個函數中統計一個數組的最大值、最小值和平均值。當然你可以編寫三個函數分別完成統計三個值的功能。但比較啰嗦,如:
int GetMax(int a[],int n){ int max=a[0],i; for(i=1;i<n;i++) { if(max<a[i]) max=a[i]; } return max;}int GetMin(int a[],int n){ int min=a[0],i; for(i=1;i<n;i++) { if(min>a[i]) min=a[i]; } return min;}double GetAvg(int a[],int n){ double avg=0; int i; for(i=0;i<n;i++) { avg+=a[i]; } return avg/n;}
其實我們完全可以在一個函數中完成這個功能,由於函數只能有一個返回值,可以返回平均值,最大值和最小值可以通過指針類型的形參來進行實現:
double Stat(int a[],int n,int *pmax,int *pmin){ double avg=a[0]; int i; *pmax=*pmin=a[0]; for(i=1;i<n;i++) { avg+=a[i]; if(*pmax<a[i]) *pmax=a[i]; if(*pmin>a[i]) *pmin=a[i]; } return avg/n;}
測試代碼如下:
int main(){ int min,max; double avg; int a[10]={10,15,25,45,87,21,54,44,14,48}; max=GetMax(a,10); min=GetMin(a,10); avg=GetAvg(a,10); printf("max=%d,min=%d,average=%.2lf
",max,min,avg); avg=Stat(a,10,&max,&min); printf("max=%d,min=%d,average=%.2lf
",max,min,avg); return 0;}
執行結果如下:
從上圖可以看出,函數Stat和以上三個函數的功能是相同的。
推薦閱讀:
※5款高效辦公實用工具推薦給你
※1 萬美元,一天時間,3D 列印一所房子
※發現一個問題,為啥那麼多人不喜歡韓系車?
※看到祖國的無人機這麼流氓,我終於放心了。