1、指針做函數參數
指針做形參,我們調用函數将實參傳遞給形參後,實參和形參指向相同的記憶體位址。也就是說、被調函數中對形參的改變影響主調函數中的實參所指對象。
指針做函數參數的作用:
a、和引用一樣,達到資料雙向傳遞的效果。
b、減少參數傳遞的開銷(引用也一樣)
c、可以通過指向函數的指針傳遞函數代碼的首位址
#include<iostream>
using namespace std;
void swap(int* a,int* b);
int main()
{
inti=1,j=2;
swap(i,j);
cout<<i<<""<<j<<endl; //i=2,j=1
//很明顯i,j的值在主調函數中改變了
return0;
}
void swap(int* a,int* b)
{
inttmp=*a;
*a=*b;
*b=tmp;
}
2、指針函數
除void之外,函數都有自己的傳回值。同樣指針也可以作為傳回值。
傳回值是指針的函數我們稱之為“指針函數”,普通函數隻能傳回一個變量或對象。
指針型函數好處是可以在函數結束調用時将大量資料從被調函數傳回到主調函數。
(當然這裡需要注意的是不能傳回局部變量的位址)
3、函數指針
我們知道程式運作時,資料會占用記憶體空間。
實際上代碼也會調入記憶體并占用記憶體空間。函數名就是函數代碼占用記憶體的首位址。
這樣函數指針就是存放函數代碼首位址的變量。
聲明形式:
資料類型 (*函數指針名)(形參清單)
//注意指針名的括号,如果沒有括号就是指針函數了
函數指針名=函數名;
#include<iostream>
using namespace std;
void swap1(int* a,int* b);
void (*funPoint)(int*,int*); //函數指針,且傳回值類型、形參個數、類型都必須比對
int main()
{
inti=1,j=2;
funPoint=swap1;
// swap1(&i,&j);
funPoint(&i,&j);//通過函數指針調用
cout<<i<<""<<j<<endl; //i=2,j=1
return0;
}
void swap1(int* a,int* b) //該函數最好不要定義為swap,不然可能調用内置的swap函數模闆
{
inttmp=*a;
*a=*b;
*b=tmp;
}