將函式的位址作為引數傳遞給另乙個函式呼叫

2021-09-05 10:11:15 字數 3537 閱讀 7372

1.在講這個問題之前,我們要明白乙個問題。就是我們為什麼要把乙個函式的位址作為引數傳遞給另乙個引數。要知道在c語言中,乙個函式內部是可以直接呼叫其他函式的,既然可以直接呼叫,為什麼還要用這麼麻煩的辦法去把函式當做引數來傳遞呢。下面我舉個例子。

例如我們設計乙個estimate() 的函式計算乙個程式執行的時間,但不同的人估算時間的時候可能演算法有所不同,算出的時間也應該不同。但我們都呼叫同乙個estimate() 函式,現在該怎麼辦呢,重寫estimate() 函式固然是乙個辦法,但是我們還有另外的辦法,比如我們把estimate()函式中計算時間的演算法作為乙個公共變數讓其作為引數傳入,我們只需要把 各自的計算時間的演算法寫成乙個函式,再通過引數傳遞給estimate() ,而estimate()中的內容還是原來的不變,這樣就可以實現不同的人計算出來的時間不同了。

2.既然知道了函式引數傳遞的用處,那麼我們現在就來說一下它的用法。

首先引數傳遞分為兩種,一種是值傳遞,一種是位址傳遞。  一般我們傳遞時用的是位址傳遞。因為,若是採用值傳遞的話,比如我們傳遞乙個陣列 double a[100],則在呼叫函式的時候。編譯器會把這整個陣列複製到函式中,這樣使用的空間是 100*sizeof(double)=800.若是我們只傳遞陣列名 a 這個位址的話,那麼複製進去的空間只有 64/8=8 這麼多(假設計算機是64位的)。這樣比較下來,就有了100倍的差距,是不是很嚇人。 所以,不管是函式作為引數,還是陣列,結構體什麼的,我們一般都用位址傳遞,而不用值傳遞,記好了。

3.下面,來看一下函式位址是怎麼傳遞的。

先說一次傳遞乙個函式的: 我們先定義乙個函式 

[cpp]view plain

copy

double add(double x, double y)  

double add(double x, double y)

然後接著建立乙個函式指標 double (*pf)(double,double)=add;  //這裡(*pf)的括號不能省,不然就不是函式指標了。

我們現在有乙個函式

[cpp]view plain

copy

double calculate(double x1, double y1, double(*f)(double, double))  //函式呼叫裡面傳遞 函式指標陣列 的方法  

double calculate(double x1, double y1, double(*f)(double, double)) //函式呼叫裡面傳遞 函式指標陣列 的方法

然後我們來進行值傳遞

[cpp]view plain

copy

int x = 2; y = 1;  

int x = 2; y = 1;
[cpp]view plain

copy

calculate(x, y, pf);  

calculate(x, y, pf);
最後可以得到輸出的結果是 2+1=3。

這是最基本的,下面講我要說的重點,就是一次傳遞多個函式進去。

想傳遞多個函式進去,我們要建立乙個函式陣列 。先定義兩個函式

[cpp]view plain

copy

double add(double x, double y)  

double add2(double x, double y)  

double add(double x, double y)

double add2(double x, double y)

然後建立函式陣列並賦值  double (*pf[2])(double,double) = ; 

接著傳遞給上面定義的calculate函式。呼叫方式為:calculate(x, y, pf);

calculate函式的接收方式應為:double calculate(double x1, double y1, double(**f)(double, double)) //傳遞的pf是乙個陣列的陣列名且本身也是乙個指標,即為二重指標     或者double calculate(double x1, double y1, double(*f)(double, double))

最後給出完整的**

[cpp]view plain

copy

#include "iostream"  

using namespace std;  

double add(double, double);  

double add2(double x, double y);  

double calculate(double x1, double y1, double(**f)(double, double))  //函式呼叫裡面傳遞 函式指標陣列 的方法  

int main()  

;   

x = 2; y = 1;  

calculate(x, y, pf);  

system("pause()");  

return 0;  

}  double add(double x, double y)  

double add2(double x, double y)  

#include "iostream"

using namespace std;

double add(double, double);

double add2(double x, double y);

double calculate(double x1, double y1, double(**f)(double, double)) //函式呼叫裡面傳遞 函式指標陣列 的方法

int main()

;

x = 2; y = 1;

calculate(x, y, pf);

system("pause()");

return 0;

}

double add(double x, double y)

double add2(double x, double y)

函式指標作為引數傳遞給函式

函式指標同樣是可以作為引數傳遞給函式的,include include using namespace std int test int int test2 int ra int int void main int argc,char argv coutfp fpi fpi test fpi賦予te...

js 把函式作為引數傳遞給另乙個方法

正常傳方法不帶引數的不做討論了,看一下方法帶引數的 例如 function function test1 func function test3 data 上述 執行後會直接彈出 22 因為test3 22 傳過去就直接執行了,而不是作為引數傳過去。解決方法兩種 1 使用匿名函式 function ...

將整個結構體作為乙個引數傳遞給函式

程式 整個結構體作為乙個引數傳遞給函式 參考 c程式設計第四版第307頁 struct stores 宣告乙個結構體 struct stores update struct stores product,float p,int q 函式宣告,更改結構體 float mul struct stores...