目录
1函数指针
1.1函数类型
通过什么来区分两个不同的函数?
一个函数在编译时被分配一个入口地址,这个地址就称为函数指针,函数名代表函数的入口地址。
函数三要素:名称,参数,返回值。
定义函数指针 : 函数返回值 (* NAME)(参数类型1、参数类型2、....) 可以没有参数
调用指针的格式:函数指针(参数类型1、参数类型2、....)
那么什么可以做回调函数,什么不能作为回调函数呢?
类成员函数绝对不能做回调函数
核心就是类成员函数需要this指针访问函数,而全局或者静态函数不需要this指针。
简言之,类的成员函数需要隐含的this指针 而回调函数没有办法提供。
.cpp
//1:定义函数类型,通过类型来定义函数指针
typedef int(FUN_Type)(int,QString);
FUN_Type * pFunc = Testfunction;
pFunc(4,"name");
(*pFunc)(5,"question");//其实写不写*都可以
int Testfunction(int a,QString name)
{
qDebug()<<"第一个参数:"<<a<<endl<<"第二个参数:"<<name;
return 0;
}
利用typedef来定义函数类型,其中的Fun_Type就用来代替 int()(int,QString)
其中Testfunction是函数名,直接将函数名给函数指针即可。
调用函数指针的时候也要注意,函数指针(函数参数1、函数参数2、......);
.cpp
//2:直接定义函数指针类型
typedef int(* FUN_TypePointer)(int,QString);
FUN_TypePointer pFuncPoniter = Testfunction;
pFuncPoniter(6,"pointer");
利用typedef来定义函数类型,其中的Fun_Type就用来代替 int(*)(int,QString)
以上两种方式都可以
输出:
.cpp
//3.直接定义函数指针变量
int(* FUN_TypePointerA)(int,QString) = Testfunction;
FUN_TypePointerA(7,"test");
直接进行定义,也是非常直观的
输出:
1.2函数指针的大小
.cpp
qDebug()<<"函数指针大小:"<<sizeof(FUN_TypePointerA);
dologic(Back);
FunPArrayTest();
输出:
1.3函数指针数组
定义函数指针 : 函数返回值 (* NAME【 】)(参数类型1、参数类型2、....) 可以没有参数
调用指针的格式:函数指针【 】(参数类型1、参数类型2、....)
加一个【】数组的特有定义符合即可
.h
//函数指针做函数参数(回调函数)
void FunPArrayTest();
void FunPArray1();
void FunPArray2();
void FunPArray3();
.cpp
void FunPArrayTest()
{
void (*FunctionArray[3])();
FunctionArray[0] = FunPArray1;
FunctionArray[1] = FunPArray2;
FunctionArray[2] = FunPArray3;
for(int i = 0;i<3;++i)
{
FunctionArray[i]();
}
}
void FunPArray1()
{
qDebug()<<"FunPArray1";
}
void FunPArray2()
{
qDebug()<<"FunPArray2";
}
void FunPArray3()
{
qDebug()<<"FunPArray3";
}
输出:
1.4函数指针做函数参数(回调函数)
.cpp
//回调函数
void AllArray(void * array,int len,int Size,void(* BACK)(void *))
{
char * start = (char *)array;
for(int i = 0;i<len;++i)
{
BACK(start);
start = start+Size;
}
}
void Test1(void * data)
{
int * realtype = (int *)data;
qDebug()<<*realtype;
}
函数AllArray,输入四个参数,数组的头指针,数组大小,数组类型大小,回调函数
意在输入任何形式的数组,都能够打印,而其中的回调函数,是用户自己写的,及Test1();
进入函数后,将void *函数变成char类型,之后在循环中,每次增加补偿就行了,因为char类型步长是1
所以每次增加的步长就是函数的第三个参数,也就是传入数据的数据类型大小。