分析C++編程傍邊指針作為函數參數的用法。本站提示廣大學習愛好者:(分析C++編程傍邊指針作為函數參數的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是分析C++編程傍邊指針作為函數參數的用法正文
在C說話中,函數指針變量罕見的用處之一是作為函數的參數,將函數名傳給其他函數的形參。如許便可以在挪用一個函數的進程中依據給定的分歧實參挪用分歧的函數。
例如,應用這類辦法可以編寫一個求定積分的通用函數,用它分離求5個函數的定積分:
可以看出,每次須要求定積分的函數是紛歧樣的。可以編寫一個求定積分的通用函數integral,它有3個形參: 上限a、下限b,和指向函數的指針變量fun。函數原型可寫為:
double integral (double a, double b, double (*fun)(double));
分離編寫5個函數f1,f2,f3,f4,f5, 用來求下面5個函數的值。然後前後挪用integral函數5次,每次挪用時把a,b和f1,f2,f3,f4,f5之一作為實參,即把下限、上限和有關函數的進口地址傳送給形參fun。在履行integral函數進程中求出各函數定積分的值。
在面向對象的C++法式設計中,這類用法就比擬少了。
函數的參數不只可所以整型、浮點型、字符型等數據,還可所以指針類型。它的感化是將一個變量的地址傳送給被挪用函數的形參。
【例】即對輸出的兩個整數按年夜小次序輸入。這裡用函數處置,並且用指針類型的數據作函數參數。法式以下:
#include <iostream> using namespace std; int main( ) { void swap(int *p1,int *p2); //函數聲明 int *pointer_1,*pointer_2,a,b; //界說指針變量pointer_1,pointer_2,整型變量a,b cin>>a>>b; pointer_1=&a; //使pointer_1指向a pointer_2=&b; //使pointer_2指向b if(a<b) swap(pointer_1,pointer_2); //假如a<b,使*pointer_1和*pointer_2交換 cout<<"max="<<a<<" min="<<b<<endl; //a已經是年夜數,b是小數 return 0; } void swap(int *p1,int *p2) //函數的感化是將*p1的值與*p2的值交流 { int temp; temp=*p1; *p1=*p2; *p2=temp; }
運轉情形以下:
45 78↙ max=78 min=45
請留意:不要將main函數中的swap函數挪用寫成
if(a<b) swap(*pointer_1, *pointer_2);
請留意交流*p1和*p2的值是若何完成的。假如寫成以下如許就有成績了:
void swap(int *p1, int *p2) { int *temp; *temp=*p1; //此語句有成績 *p1=*p2; *p2=*temp; }
本例采用的辦法是交流a和b的值,而p1和p2的值不變。
可以看到,在履行swap函數後,主函數中的變量a和b的值轉變了。這個轉變不是經由過程將形參值傳回實參來完成的。請讀者斟酌一下可否經由過程挪用上面的函數完成a和b交換。
void swap(int x, int y) { int temp; temp=x; x=y; y=temp; }
在main函數頂用“swap(a, b);”挪用swap函數,會有甚麼成果呢?在函數挪用時,a的值傳送給x,b的值傳送給y。履行完swap函數最初一個語句後,x和y的值是交換了,但main函數中的a和b並未交換,如圖6.10(b)所示。也就是說因為真假聯合是采用單向的“值傳遞”方法,只能從實參向形參傳數據,形參值的轉變沒法回傳給實參。
為了使在函數中轉變了的變量值能被main函數所用,不克不及采用把要轉變值的變量作為參數的方法,而應當用指針變量作為函數參數。在函數履行進程中使指針變量所指向的變量值產生變更,函數挪用停止後,這些變量值的變更仍然保存上去,如許就完成了“經由過程挪用函數使變量的值產生變更,在主調函數中應用這些轉變了的值”的目標。
假如想經由過程函數挪用獲得n個要轉變的值,可以采用上面的步調:
在主調函數中設n個變量,用n個指針變量指向它們;
編寫被挪用函數,其形參為n個指針變量,這些形參指針變量應該與主調函數中的n個指針變量具有雷同的基類型;
在主調函數中將n個指針變量作實參,將它們的值(是地址值)傳給所挪用函數的n個形參指針變量,如許,形參指針變量也指向這n個變量;
經由過程形參指針變量的指向,轉變該n個變量的值;
在主調函數中便可以應用這些轉變了值的變量。
請留意,不克不及妄圖經由過程轉變形參指針變量的值而使實參指針變量的值轉變。請剖析上面法式:
#include <iostream> using namespace std; int main( ) { void swap(int *p1,int *p2); int *pointer_1,*pointer_2,a,b; cin>>a>>b; pointer_1=&a; pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); cout<<"max="<<a<<" min="<<b<<endl; return 0; } void swap(int *p1,int *p2) { int *temp; temp=p1; p1=p2; p2=temp; }
實參變量和形參變量之間的數據傳遞是單向的“值傳遞”方法。指針變量作函數參數也要遵守這一規矩。挪用函數時不會轉變實參指針變量的值,但可以轉變實參指針變量所指向變量的值。
函數的挪用可以(並且只可以)獲得一個前往值(即函數值),而應用指針變量作函數參數,便可以經由過程指針變量轉變主調函數中變量的值,相當於經由過程函數挪用從被挪用的函數中獲得多個值。假如不消指針變量是難以做到這一點的。
【例】輸出a,b,c 3個整數,按由年夜到小的次序輸入。
用下面引見的辦法,用3個指針變量指向3個整型變量,然後用swap函數來完成交換3個整型變量的值。法式以下:
#include <iostream> using namespace std; int main( ) { void exchange(int *,int *,int *); //對exchange函數的聲明 int a,b,c,*p1,*p2,*p3; cin>>a>>b>>c; //輸出3個整數 p1=&a;p2=&b;p3=&c; //指向3個整型變量 exchange(p1,p2,p3); //交流p1,p2,p3指向的3個整型變量的值 cout<<a<<" "<<b<<" "<<c<<endl; //按由年夜到小的次序輸入3個整數 } void exchange(int *q1,int *q2,int *q3) { void swap(int *,int *); //對swap函數的聲明 if(*q1<*q2) swap(q1,q2); //挪用swap,將q1與q2所指向的變量的值交換 if(*q1<*q3) swap(q1,q3); //挪用swap,將q1與q3所指向的變量的值交換 if(*q2<*q3) swap(q2,q3); //挪用swap,將q2與q3所指向的變量的值交換 } void swap(int *pt1,int *pt2) //將pt1與pt2所指向的變量的值交換 { int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; }
運轉情形以下:
12 -56 87↙ 87 12 -56