函数指针变量
PS:本章节摘录自参考1:函数指针及其定义和用法,C语言函数指针详解 http://c.biancheng.net/view/228.html
函数指针全称为函数指针变量,是一个指向函数地址的指针变量。
函数地址
函数在编译时,系统会为这个函数分配一段存储空间,存储空间的首地址称为函数的地址,函数名表示的就是这个地址。
函数指针变量定义
int(*pFunc)(int, int);
这个语句定义了一个指向函数的指针变量pFunc。
首先它是一个指针,所以要有一个“*”,即(pFunc);其次前面的int和后面括号中的两个int表示指针变量pFunc可以指向返回值为int型,且有两个int型入参的函数;
pFunc的类型为int ()(int, int)。
所以函数指针的定义方式为:
函数返回值类型 (* 指针变量名) (函数参数列表);
“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。
我们看到,函数指针的定义就是将“函数声明”中的“函数名”改成“(*指针变量名)”。但是这里需要注意的是:“(*指针变量名)”两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
那么怎么判断一个指针变量是指向变量的指针变量还是指向函数的指针变量呢?首先看变量名前面有没有“”,如果有“”说明是指针变量;其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。
最后需要注意的是,指向函数的指针变量没有 ++ 和 – 运算。
如何用函数指针实现多态
typedef int (*FuncPointer)(int, int);
首先定义类型为int (*)(int, int)的函数指针类型FuncPointer;
int FuncA(int a, int b)
{
return a + b;
}
int FuncB(int a, int b)
{
return a - b;
}
其次定义多个类型为int (*)(int, int)的函数实现。
typedef enum {
ADD_OPERATOR,
MINUS_OPERATOR,
OPERATOR_END
} Operator;
int MultiPolymorphism(Operator type, int a, int b)
{
FuncPointer funcList[OPERATOR_END] = { FuncA, FuncB };
return funcList[type](a, b);
}
int main()
{
int c = MultiPolymorphism(ADD_OPERATOR, 3, 2);
int d = MultiPolymorphism(MINUS_OPERATOR, 3, 2);
printf("c = %d, d = %d\n", c, d);
}
最后实现多态调用。函数指针数组funcList指向不同的实现函数,通过不同的Operator类型实现不同函数的调用。