函數指針
首先要知道函數指針是個啥,纔好理解回調函數。
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()函數。