天天看點

将函數的位址作為參數傳遞給另一個函數調用

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 ?

  1. double add(double x, double y)  
  2. {  
  3.     return x + y;  
  4. }  
double add(double x, double y)
{
	return x + y;
}
           

然後接着建立一個函數指針 double (*pf)(double,double)=add;  //這裡(*pf)的括号不能省,不然就不是函數指針了。

我們現在有一個函數

[cpp] view plain copy print ?

  1. double calculate(double x1, double y1, double(*f)(double, double))  //函數調用裡面傳遞 函數指針數組 的方法  
  2. {  
  3.     cout << "add:" << (*f)(x1, y1) << endl;  
  4.     return  1;  
  5. }  
double calculate(double x1, double y1, double(*f)(double, double))  //函數調用裡面傳遞 函數指針數組 的方法
{
	cout << "add:" << (*f)(x1, y1) << endl;
	return  1;
}
           

然後我們來進行值傳遞

[cpp] view plain copy print ?

  1. int x = 2; y = 1;  
int x = 2; y = 1;
           

[cpp] view plain copy print ?

  1. calculate(x, y, pf);  
calculate(x, y, pf);
           

最後可以得到輸出的結果是 2+1=3。

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

想傳遞多個函數進去,我們要建立一個函數數組 。先定義兩個函數

[cpp] view plain copy print ?

  1. double add(double x, double y)  
  2. {  
  3.     return x + y;  
  4. }  
  5. double add2(double x, double y)  
  6. {  
  7.     return x - y;  
  8. }  
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 ?

  1. #include "iostream"  
  2. using namespace std;  
  3. double add(double, double);  
  4. double add2(double x, double y);  
  5. double calculate(double x1, double y1, double(**f)(double, double))  //函數調用裡面傳遞 函數指針數組 的方法  
  6. {  
  7.     cout << "add:" << (*f[0])(x1, y1) << endl;  
  8.     cout << "add2:" << (*f[1])(x1, y1) << endl;  
  9.     return  1;  
  10. }  
  11. int main()  
  12. {  
  13.     int x, y;  
  14.     double (*pf[2])(double,double) = { add, add2 };   
  15.     x = 2; y = 1;  
  16.     calculate(x, y, pf);  
  17.     system("pause()");  
  18.     return 0;  
  19. }  
  20. double add(double x, double y)  
  21. {  
  22.     return x + y;  
  23. }  
  24. double add2(double x, double y)  
  25. {  
  26.     return x - y;  
  27. }  
#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