c++指针函数和函数指针概述
欢迎指正
代码写的不够规范: 目的是缩短文章篇幅,实际中请注意
阅读完本文, 你一定能判断和写出:指针函数和函数指针。
0、结论
A、指针函数: 函数的返回值是指针类型
B、函数指针: 函数名是一个指针
1、分析
A、一定出现在函数。
B、关键词: 函数和指针。
C、 函数, 包括返回值类型、函数名、函数参数
D、指针: 地址运算符* 和 指针变量
E、排除函数参数。那么就剩下 函数返回值类型 和 函数名了。
F 、函数和变量一样,也是有地址的。 函数名就是函数的地址。
一个例子:xcode输出main函数和add函数的地址

2、形式
先给出形式,下面再解释。
A、 指针函数
声明格式: 类型说明符 * 函数名(参数);
举例:
| char* get_buf(); |
这是一个指针函数的声明, 函数的返回类型是 char* , 函数名:get_buf, 没有参数需要传入。
B、函数指针
声明格式:类型说明符 (*指针变量名)(参数); 或者 typedef 类型说明符 (*指针变量名)(参数);
举例:
| typedef char (*pfunc)(); |
这是一个函数指针的声明格式,返回类型为char, 函数名是一个指针,无参数需要传入。
3、解读
方法: 解读顺序:根据声明,从左到右依次解读。关键: *与什么结合
A、指针函数 举例: char* get_buf();
首先, 整体判断,这是一个函数。 那我们找找函数的返回值类型,函数名,参数。
返回值: char*
函数名: get_buf
参数:无
这里,char 与 * 结合形成整体,表示的是函数的返回值类型。 不要理解错: * 不是与函数名get_buf先结合。 指针的地址运算符在前,函数名在后,连起来: 指针函数, 这是一个返回值为char*的函数,没有参数需要传入。
B、函数指针, 举例: int (*pfunc)();
首先,整体判断,这是一个函数。 找找函数的返回值类型 、函数名、参数
返回值类型: int
函数名:(*func)
参数:无
这里:*与pfunc结合,形成指针。 和平常常见的函数不一样。 比普通的函数名多了一个指针的地址解析运算符*。 将*pfunc视为整体,这个整体表示的是函数名,也就是说,用一个指针代替了原来的函数名。 函数指针: 函数名是一个指针。 函数也有地址,这里只使用一个指针指向了函数的地址。
4、一个例子
|
// 指针函数 int* get_result() { static int index = 100; return &index; } // 用作举例函数指针使用 int get_id() { static int index = 1; return index++; } // 用一个函数指针指向上面的get_id函数 typedef int (*pfunc)(); int main(int argc, const char * argv[]) { std::cout << "1、输出指针函数结果:" << *(get_result()) << std::endl; std::cout << "\n2、下面演示调用函数指针输出:"; pfunc pget_id_func = get_id; std::cout << pget_id_func() << std::endl; return 0; } |
结果:

c++指针函数和函数指针概述的更多相关文章
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- 12-返回指针的函数&&指向函数的指针
前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针 一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...
- cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())
void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...
- 对线程等待函数pthread_join二级指针参数分析
分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...
- C语言指针变量作为函数参数
0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- 指针数组vs数组指针 指针函数vs函数指针
在分辨这些重要的概念时,我们先回顾一下前面所讲的C之三值合一,由于三个值所求出的地址是相同的,所以经常有传言说他们都是首元素的地址.这种说法是不正确的.为什么说它是不正确的呢? 首先定义一个指针,将三 ...
随机推荐
- MEGA软件——系统发育树构建方法(图文讲解) 转载
转载:http://www.plob.org/2012/12/02/4927.html 一.序列文本的准备 构树之前先将目标基因序列都分别保存为txt文本文件中(或者把所有序列保存在同一个txt文本中 ...
- R语言中的正则表达式(转载:http://blog.csdn.net/duqi_yc/article/details/9817243)
转载:http://blog.csdn.net/duqi_yc/article/details/9817243 目录 Table of Contents 1 正则表达式简介 2 字符数统计和字符翻译 ...
- (转载)java中判断字符串是否为数字的方法的几种方法
java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...
- 巩固javaweb的第十九天
巩固内容: 使用 form 元素 使用 form 元素封装要提交的信息 要向服务器提交信息,需要使用 form 元素,所有要提交的信息都应该在 form 内部.在 注册界面中,所有要输入的信息都位于 ...
- 生产调优3 HDFS-多目录配置
目录 HDFS-多目录配置 NameNode多目录配置 1.修改hdfs-site.xml 2.格式化NameNode DataNode多目录配置(重要) 1.修改hdfs-site.xml 2.测试 ...
- 生产调优1 HDFS-核心参数
目录 1 HFDS核心参数 1.1 NameNode 内存生产配置 问题描述 hadoop-env.sh中配置 1.2 NameNode 心跳并发配置 修改hdfs-site.xml配置 1.3 开启 ...
- addict, address, adequate.四级
addict addiction – a biopsychosocial [生物社会心理学的 bio-psycho-social] disorder characterized by persiste ...
- angular中路由跳转并传值四种方式
一.路由传值 步骤1 路由传递参数 注意 一定是要传递 索引值 let key = index 这种情况是在浏览器中可以显示对应的参数 这种的是问号 localhost:8080/news?id=2& ...
- 容器之分类与各种测试(三)——stack
stack是栈,其实现也是使用了双端队列(只要不用双端队列的一端,仅用单端数据进出即完成单端队列的功能),由于queue和stack的实现均是使用deque,没有自己的数据结构和算法,所以这俩也被称为 ...
- [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴 ...