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 print ?
- double add(double x, double y)
- {
- return x + y;
- }
double add(double x, double y)
{
return x + y;
}
然後接着建立一個函數指針 double (*pf)(double,double)=add; //這裡(*pf)的括号不能省,不然就不是函數指針了。
我們現在有一個函數
[cpp] view plain copy print ?
- double calculate(double x1, double y1, double(*f)(double, double)) //函數調用裡面傳遞 函數指針數組 的方法
- {
- cout << "add:" << (*f)(x1, y1) << endl;
- return 1;
- }
double calculate(double x1, double y1, double(*f)(double, double)) //函數調用裡面傳遞 函數指針數組 的方法
{
cout << "add:" << (*f)(x1, y1) << endl;
return 1;
}
然後我們來進行值傳遞
[cpp] view plain copy print ?
- int x = 2; y = 1;
int x = 2; y = 1;
[cpp] view plain copy print ?
- calculate(x, y, pf);
calculate(x, y, pf);
最後可以得到輸出的結果是 2+1=3。
這是最基本的,下面講我要說的重點,就是一次傳遞多個函數進去。
想傳遞多個函數進去,我們要建立一個函數數組 。先定義兩個函數
[cpp] view plain copy print ?
- double add(double x, double y)
- {
- return x + y;
- }
- double add2(double x, double y)
- {
- return x - y;
- }
double add(double x, double y)
{
return x + y;
}
double add2(double x, double y)
{
return x - y;
}
然後建立函數數組并指派 double (*pf[2])(double,double) = { add, add2 };
接着傳遞給上面定義的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 print ?
- #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)) //函數調用裡面傳遞 函數指針數組 的方法
- {
- cout << "add:" << (*f[0])(x1, y1) << endl;
- cout << "add2:" << (*f[1])(x1, y1) << endl;
- return 1;
- }
- int main()
- {
- int x, y;
- double (*pf[2])(double,double) = { add, add2 };
- x = 2; y = 1;
- calculate(x, y, pf);
- system("pause()");
- return 0;
- }
- double add(double x, double y)
- {
- return x + y;
- }
- double add2(double x, double y)
- {
- return x - 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)) //函數調用裡面傳遞 函數指針數組 的方法
{
cout << "add:" << (*f[0])(x1, y1) << endl;
cout << "add2:" << (*f[1])(x1, y1) << endl;
return 1;
}
int main()
{
int x, y;
double (*pf[2])(double,double) = { add, add2 };
x = 2; y = 1;
calculate(x, y, pf);
system("pause()");
return 0;
}
double add(double x, double y)
{
return x + y;
}
double add2(double x, double y)
{
return x - y;
}
轉載自:http://blog.csdn.net/c_flybird/article/details/49431009