5、函数指针与函数地址

函数指针的含义

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

函数指针的表示

函数指针的含义是一个指针指向某个函数,根据含义可以表示为:

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"); //调用
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容