C++的函數(shù)與指針
函數(shù)與指針
一個(gè)函數(shù)在編譯時(shí)被分配一個(gè)入口地址,這個(gè)入口地址就稱(chēng)為函數(shù)的指針。在C++中, 函數(shù)名代表函數(shù)的入口地址。
- 指針作函數(shù)的參數(shù)-實(shí)現(xiàn)地址傳遞
- 返回指針的函數(shù)
- 利用指向函數(shù)的指針調(diào)用函數(shù)
指針作函數(shù)的參數(shù)-實(shí)現(xiàn)地址傳遞
指針作函數(shù)的參數(shù),具有以下用途:
- 指針作函數(shù)參數(shù),這時(shí)形參接受的是實(shí)參的地址。函數(shù)中通過(guò)對(duì)指針的間接訪問(wèn)實(shí)現(xiàn)參數(shù)的按“引用傳遞”功能
- 設(shè)置多個(gè)指針參數(shù)可從函數(shù)中帶回多個(gè)結(jié)果值
- 對(duì)于傳遞一塊連續(xù)的內(nèi)存區(qū)域數(shù)據(jù),傳遞首地址比傳遞數(shù)
據(jù)值不僅開(kāi)銷(xiāo)小而且效率高
例如:
編寫(xiě)交換兩個(gè)變量值的函數(shù)(地址傳遞)
相當(dāng)于改變兩個(gè)指針指向的變量?jī)?nèi)容。
void swap(int *px, *py) { int t; t = *px; *px = *py; *py = t; } int main() { int x=2, y=3; cout<<"調(diào)用前:x="<<x<<",y="<<y<<endl; swap(&x, &y); cout<<"調(diào)用后:x="<<x<<",y="<<y<<endl; return 0; }
/*
輸出:
調(diào)用前:x=2, y=3
調(diào)用后:x=3, y=2
*/
例如:
利用指針參數(shù)帶回函數(shù)中的多個(gè)值
計(jì)算一維數(shù)組元素的平均值,并能帶回?cái)?shù)組中的最大值與最小值
函數(shù)原型設(shè)計(jì)如下:
double faver(int s[], int n, int *max, int *min);
其中:
s-一維數(shù)組
n-數(shù)組中元素個(gè)數(shù)
max-指向最大值
min-指向最小值
將平均值作為函數(shù)的返回值
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); //調(diào)用函數(shù) cout<<"max="<<max<<"\n"<<"min="<<min<<endl; cout<<"aver="<<aver<<endl; return 0; } /* max=98 min=67 aver=82 */
返回指針的函數(shù)
返回指針的函數(shù)定義格式如下:
類(lèi)型 * 函數(shù)名(形式參數(shù)表) { 語(yǔ)句序列 }
其中:
類(lèi)型 * 為函數(shù)的返回值類(lèi)型,是一個(gè)指針類(lèi)型
例子
編寫(xiě)函數(shù),返回字符串中首次出現(xiàn)的非空格字符開(kāi)始的字符串
如:" 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; }
指向函數(shù)的指針變量
使用指向函數(shù)的指針變量可以存放函數(shù)的指針
指向函數(shù)的指針變量定義格式如下:
函數(shù)返回值類(lèi)型 ( * 指針變量名 ) (形參類(lèi)型表列);
注意,中間的括號(hào)不能省略
例如:
定義指向double型函數(shù)的指針變量,該函數(shù)有一個(gè)double型參數(shù)
double (*pf)( double ); pf=sqrt; //pf 指向一個(gè)平方根函數(shù)
時(shí),使用*pf可以調(diào)用該函數(shù)。
cout<<(*pf)(2.0)<<endl; //輸出根號(hào)2的值 與 cout<<sqrt(2.0)<<endl; 表示式是等價(jià)的
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
VC實(shí)現(xiàn)給窗體的一個(gè)按鈕添加事件的方法
這篇文章主要介紹了VC實(shí)現(xiàn)給窗體的一個(gè)按鈕添加事件的方法,通過(guò)三個(gè)簡(jiǎn)單步驟實(shí)現(xiàn)窗體按鈕添加事件,需要的朋友可以參考下2015-05-05C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法
這篇文章主要介紹了C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下2021-01-01C語(yǔ)言面試常見(jiàn)考點(diǎn)排序總結(jié)
深處開(kāi)發(fā)崗,其實(shí)排序也是繞不開(kāi)的環(huán)節(jié),其中冒泡排序,選擇排序,插入排序,歸并排序,快速排序,堆排序也是我在秋招以來(lái)頻繁問(wèn)到的技術(shù)點(diǎn),今天我們來(lái)重點(diǎn)聊聊排序2021-11-11C++?boost?thread庫(kù)用法詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11MFC程序中使用QT開(kāi)發(fā)界面的實(shí)現(xiàn)步驟
本文主要介紹了MFC程序中使用QT開(kāi)發(fā)界面的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12一文教你Qt如何操作SQLite數(shù)據(jù)庫(kù)
Sqlite 數(shù)據(jù)庫(kù)作為 Qt 項(xiàng)目開(kāi)發(fā)中經(jīng)常使用的一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),可以說(shuō)是兼容性相對(duì)比較好的數(shù)據(jù)庫(kù)之一。本文為大家介紹了Qt操作SQLite數(shù)據(jù)庫(kù)的具體方法,希望對(duì)大家有所幫助2023-03-03