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()函数。

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