博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 函数指针
阅读量:5816 次
发布时间:2019-06-18

本文共 1791 字,大约阅读时间需要 5 分钟。

转载自http://c.biancheng.net/view/228.html

函数指针大家了解一下就行了,用得不多,但一定要认识它。

什么是函数指针

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

那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如:

 1 int(*p)(int, int); 

这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。

所以函数指针的定义方式为:

函数返回值类型 (* 指针变量名) (函数参数列表);

“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。

我们看到,函数指针的定义就是将“函数声明”中的“函数名”改成“(*指针变量名)”。但是这里需要注意的是:“(*指针变量名)”两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
那么怎么判断一个指针变量是指向变量的指针变量还是指向函数的指针变量呢?首先看变量名前面有没有“*”,如果有“*”说明是指针变量;其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。
最后需要注意的是,指向函数的指针变量没有 ++ 和 -- 运算。

如何用函数指针调用函数

给大家举一个例子:

1 int Func(int x);   /*声明一个函数*/2 int (*p) (int x);  /*定义一个函数指针*/3 p = Func;          /*将Func函数的首地址赋给指针变量p*/

赋值时函数 Func 不带括号,也不带参数。由于函数名 Func 代表函数的首地址,因此经过赋值以后,指针变量 p 就指向函数 Func() 代码的首地址了。

下面来写一个程序,看了这个程序你们就明白函数指针怎么使用了:

1 # include 
2 int Max(int, int); //函数声明 3 int main(void) 4 { 5 int(*p)(int, int); //定义一个函数指针 6 int a, b, c; 7 p = Max; //把函数Max赋给指针变量p, 使p指向Max函数 8 printf("please enter a and b:"); 9 scanf("%d%d", &a, &b);10 c = (*p)(a, b); //通过函数指针调用Max函数11 printf("a = %d\nb = %d\nmax = %d\n", a, b, c);12 return 0;13 }14 int Max(int x, int y) //定义Max函数15 {16 int z;17 if (x > y)18 {19 z = x;20 }21 else22 {23 z = y;24 }25 return z;26 } 输出结果是: please enter a and b:3 4 a = 3 b = 4 max = 4

 

转载于:https://www.cnblogs.com/xuhongfei0021/p/10794558.html

你可能感兴趣的文章
如何删除PHP数组中的元素,并且索引重排(unset,array_splice)?
查看>>
网站架构演变
查看>>
MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)
查看>>
做一款仿映客的直播App?看我就够了
查看>>
前端每周清单第 42 期:V8 的执行流与优化, Pinterest 的 PWA 实践, Rust 与 WebAssembly 应用...
查看>>
自定义Gradle-Plugin 插件
查看>>
Tensorflow Python API 翻译(array_ops)
查看>>
Spring框架标签EL表达式执行漏洞分析(CVE-2011-2730)
查看>>
RxJava从入门到不离不弃(三)——转换操作符
查看>>
【小程序踩坑系列3】小程序退出后扫码再进入,“外部”代码不会再次执行
查看>>
Flexbox布局
查看>>
solr 7.0 tomcat 安装配置 + 中文分词
查看>>
吐血整理,Android常用库和插件,避免重复造轮子
查看>>
redux 源码研究:中间件
查看>>
1024全方位防脱发攻略?做发量和代码最刚的程序员
查看>>
好玩的 RAC
查看>>
聊聊eureka client的fetch-remote-regions-registry属性
查看>>
并发编程之 AQS 源码剖析
查看>>
Python 系列教程(入门系列已写完)
查看>>
草根学Python(十一)枚举类
查看>>