C++的函數與指針
函數與指針
一個函數在編譯時被分配一個入口地址,這個入口地址就稱為函數的指針。在C++中, 函數名代表函數的入口地址。
- 指針作函數的參數-實現(xiàn)地址傳遞
- 返回指針的函數
- 利用指向函數的指針調用函數
指針作函數的參數-實現(xiàn)地址傳遞
指針作函數的參數,具有以下用途:
- 指針作函數參數,這時形參接受的是實參的地址。函數中通過對指針的間接訪問實現(xiàn)參數的按“引用傳遞”功能
- 設置多個指針參數可從函數中帶回多個結果值
- 對于傳遞一塊連續(xù)的內存區(qū)域數據,傳遞首地址比傳遞數
據值不僅開銷小而且效率高
例如:
編寫交換兩個變量值的函數(地址傳遞)
相當于改變兩個指針指向的變量內容。
void swap(int *px, *py) { int t; t = *px; *px = *py; *py = t; } int main() { int x=2, y=3; cout<<"調用前:x="<<x<<",y="<<y<<endl; swap(&x, &y); cout<<"調用后:x="<<x<<",y="<<y<<endl; return 0; }
/*
輸出:
調用前:x=2, y=3
調用后:x=3, y=2
*/
例如:
利用指針參數帶回函數中的多個值
計算一維數組元素的平均值,并能帶回數組中的最大值與最小值
函數原型設計如下:
double faver(int s[], int n, int *max, int *min);
其中:
s-一維數組
n-數組中元素個數
max-指向最大值
min-指向最小值
將平均值作為函數的返回值
double faver(int s[],int n,int *max,int *min) { double aver=s[0]; *max= *min =s[0]; for(int i=1;i<n;i++) { aver+=s[i]; if(s[i]>*max)*max=s[i]; if(s[i]<*min)*min=s[i]; } return aver/n; } int main() { int a[5]={80,89,67,76,98}, max, min; double aver; aver=faver(a,5,&max,&min); //調用函數 cout<<"max="<<max<<"\n"<<"min="<<min<<endl; cout<<"aver="<<aver<<endl; return 0; } /* max=98 min=67 aver=82 */
返回指針的函數
返回指針的函數定義格式如下:
類型 * 函數名(形式參數表) { 語句序列 }
其中:
類型 * 為函數的返回值類型,是一個指針類型
例子
編寫函數,返回字符串中首次出現(xiàn)的非空格字符開始的字符串
如:" using namespace std;"
返回"using namespace std;"
char * noblank(char * str) { while(*str == ' ') str++; return str; } int main() { char *s1 = " using namespace std;", *s2; s2 = noblank(s1); cout << s2 << endl; return 0; }
指向函數的指針變量
使用指向函數的指針變量可以存放函數的指針
指向函數的指針變量定義格式如下:
函數返回值類型 ( * 指針變量名 ) (形參類型表列);
注意,中間的括號不能省略
例如:
定義指向double型函數的指針變量,該函數有一個double型參數
double (*pf)( double ); pf=sqrt; //pf 指向一個平方根函數
時,使用*pf可以調用該函數。
cout<<(*pf)(2.0)<<endl; //輸出根號2的值 與 cout<<sqrt(2.0)<<endl; 表示式是等價的
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!