函数指针
指针我们知道实际上是一个变量或者数组等的地址。如我们定义:
void *Ptr;
该指针变量可以指向我们希望指向的地址,如我们有数组为
a[2] = {0,1};
那么我们可以通过给指针变量赋值,使其指向该数组Ptr = a;
。
函数指针实际上和这种指针类似,只不过其变量类型是一个函数类型而已。如果觉得搞不明白,可以把函数类型理解为和int
一样的数据类型。
如我们可以这样定义一个函数
void DataTrans(int Data, int Len);
那么同样我们可以这样定义一个函数指针
void (*DataTransPtr)(int Data,int Len);
对比函数的定义和函数指针的定义可以发现,不同的是函数指针需要在函数名前加上 *
以代表该变量是个指针变量,其余的和函数的定义一样。
所以这样的话我们就可以通过赋值将函数的地址赋给函数指针,使函数指针指向该函数。DataTransPtr = DataTrans;
或者DataTransPtr = &DataTrans;
两者等价。
指针变量
定义时需要加星号,使用时不需要加。使用时如果加的话便是取该地址上的值了。
函数指针数组
从上面可以看出给函数指针赋值时我们用了两种方式,其实C语言中的函数名本身代表的就是该函数的首地址。因此对于函数指针数组而言,直接使用函数名即可。
首先定义3个函数为
void FA(int a, int b);
void FB(int a, int b);
void FC(int a, int b);
然后定义一个同类型的函数指针
void (*FPtr)(int a, int b);
然后定义一个数组
对于以上的三种定义可以类比为变量的定义,类比如下
我们定义了3个变量分别为
int F1; int F2; int F3;
然后定义了一个同类型的指针变量
int *F1;
然后定义了一个数组
int array_int[3];
当然我们可以把三个变量的值赋给数组
array_int[0] = F1;
想要赋值的话需要保证F1
和array_int
的类型相同,例子中他们都是int
型,所以可以赋值。
那么对于函数指针数组来说,如果要给函数指针数组赋值,也同样需要保证类型一致。
首先我们需要把函数指针重新做一下定义
typedef void(* FPtr)(int a, int b);
这样是重新定义了一个新类型,也就是函数指针类型,可类比int
。
然后对数组定义
FPtr array[3];
这样数组的类型就是函数指针类型,可以通过对数组赋值完成函数的调用,如
FPtr array[] = {
FA;
FB;
FC; }
当我们需要调用函数FA
时,可直接使用array0
来调用。