C++ 回調函數 我給你分析清楚地址之間的關係

函數指針

首先要知道函數指針是個啥,纔好理解回調函數。

int func1(int a, int b)
{
	return a + b;
}
void test01()
{
	//定義函數類型 
	typedef int(my_func)(int, int);
	//定義函數指針 
	cout << func1 << endl;   //002E1604
	my_func* pFunc = func1;   //func1代表地址
	cout << pFunc << endl;   //002E1604
	int result = func1(10, 20);
	int resultp = pFunc(10, 20);
	cout << (*pFunc) << endl;   //這個也是002E1604   這個就很費解。
	//我後來想了想,func是函數的地址,也是輸出func的時候,輸出的內容,
	//因爲也沒法輸出整個函數嘛。
	//這裏的輸出的情況和普通的int型指針關於這三者的輸出是不一樣的。
	//不過一樣的地址纔可以解釋下面的這句話。
	int resultp2 = (*pFunc)(10, 20);
	printf("%d,%d,%d\n", result, resultp, resultp2);   //輸出都是30.
	//接着直接定義函數指針類型 
	typedef int(*my_pfunc)(int, int);
	my_pfunc  pFunc2 = func1;
	printf("%d\n", pFunc2(10, 20));
	//接着直接定義函數指針變量
	int(*my_func_p)(int, int) = NULL;
	my_func_p = func1;
	printf("%d\n", my_func_p(10, 20));
}

作爲形參時。

int add3(int a, int b)
{
	return a + b - 10;
}
//函數指針作爲另外一個函數的參數 
void test02(int(*pAdd)(int, int))   //表示一個函數指針變量 pAdd
{
	int a = 100;
	int b = 200;
	int result = pAdd(a, b);    //這個的pAdd在實際執行時,會得到add3的值,即地址。
	printf("result = %d\n", result);
}
//調用
test02(add3);

以上是我以前寫的一份講解指針知識裏面的一部分,我覺得對函數指針講的很清楚。
想一下子弄懂結構體 指針 數組 函數 等等之間的各種組合體嘛。比如 函數指針、指針數組等等。
看我的這兩篇文章吧。
關於指針的知識回顧
把數組、結構體等都看成是一種數據類型!

回調函數

就是把函數名作爲參數傳遞。函數名就是地址。前面提到的。
上面的例子中的test02(add)就是回調函數的一個例子,實際運行的時候,test02會調用add3()函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章