函数指针的含义
如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
函数指针的表示
函数指针的含义是一个指针指向某个函数,根据含义可以表示为:
int(char, int) *p
但是这样写不符合指针使用习惯,根据指针的表示原则是变量右边的优先级更高,我们可以将上面的函数指针改写为
int (*p)(char, int)
首先它是一个指针变量,所以要有一个“”,即(p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的char和int 表示这个指针变量可以指向有两个参数分别为char和int的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(char,int)。
因此函数指针的一般形式为:
函数返回值类型 (* 指针变量名) (函数参数列表);
函数指针的使用
函数指针的使用涉及到函数指针的定义,函数指针的赋值,函数指针的调用
int add(int a, int b)
{
return a + b
}
int (*p)(int, int);//定义
p = add; //赋值
p(10, 20) //调用
函数指针的强制类型转换
函数指针的赋值过程中往往涉及到强制类型转换;下面举例直接将函数的地址赋值给函数指针;
现需要将printf函数的地址直接赋值给函数指针,使用函数指针代替printf
int (*p)(const char *, ...); //根据printf原型定义函数指针
p = printf; //赋值
p("hello world!\n"); //调用
假定printf的函数地址为0x8048320可以将该地址强制类型转换赋值给p
int (*p)(const char *, ...); //根据printf原型定义函数指针
p = (int (*)(const char *, ...)0x8048320; //强制类型转换并赋值
p("hello world!\n"); //调用