C语言高级进阶

函数指针


学习内容

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。 函数指针有两个用途:调用函数和做函数的参数。


学习产出

函数指针的声明

void (*foo)();   //foo是一个函数指针变量,该函数指针指向的函数接受void类型参数,返回void类型值。

这个声明很像函数原型的声明,如果去掉第一对括号,看起来就像函数foo的原型,它接受void类型参数,返回void *类型值。括号让这个声明变成了一个名为foo的函数指针,*号表示这是一个指针。
如下图所示表示函数指针声明的各个部分:

下面是声明函数指针的其他一些例子:

int(*f1)(double);    //传入double,返回int
void (*f2)(char *);    //传入char指针,返回void
double * (*f3)(int,int);    //传入两个整型参数,返回double指针

对函数指针在命名约定上我们建议用fptr做前缀。
另外不要把返回值为指针的函数和函数指针搞混,下面f4是一个函数,它返回一个整型指针,而变量f5是一个返回值为整型的函数指针,变量f6是一个返回值为整型指针的函数指针。

int *f4();
int (*f5)();
int* (*f6)();

函数指针的使用
下面是使用函数指针的一个简单示例,示例函数接受一个整型参数并返回一个整型参数。

int (*fptr1)(int);int square(int n)
{return n*n;
}int main()
{int a = 6;fptr1 = square;printf("%d squared is %d\n", a, fptr1(a));
}

执行结果如下:

函数指针的声明和使用相关推荐

  1. 使用typedef简化函数指针的声明

    #include <iostream> using namespace std; void square(float&x,float&y){x=x*x;y=y*y;} vo ...

  2. 理解复杂的C/C++声明 const, typedef , 函数指针(转贴)

    让我们从一个非常简单的例子开始,如下: int n; 这个应该被理解为"declare n as an int"(n是一个int型的变量). 接下去来看一下指针变量,如下: int ...

  3. 函数指针--全局函数指针与类的函数指针(二)

    本次对之前的说明做个补充,大体内容还是一样的. 这里对类里面的成员函数指针变量的使用继续进行了解,最主要的是希望能达到通过非静态成员指针变量来引用各自的非静态成员函数. 这样每个实例可以保存当前对象对 ...

  4. 【 C 】初识函数指针

    函数指针,顾名思义,也就是指针,不过这个指针是指向函数的指针. 在[ C ]高级指针话题之高级声明的演进 这篇博文中提到了函数指针的声明等,摘出来: 接下来的一个声明更有趣,但也更容易让人疑惑: in ...

  5. 恼人的函数指针(二)

    原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html 前面曾写过一篇恼人的函数指针(一).总结了普通函数指针的声明. ...

  6. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  7. 一般函数指针和类(非MFC)的成员函数指针

    函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的 ...

  8. C++中的函数指针和函数对象总结

    篇一.函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参 ...

  9. 对函数指针与typedef的理解:typedef void (*sighandler_t)(int)

    文章目录 缘由 解释函数指针int (\*f)(int*); 解释typedef void(*sighandler_t)(int) 缘由 2021年9月22日在刷CS:APP的时候,邂逅了一种函数指针 ...

最新文章

  1. 如何建立和维护自己的“人脉”
  2. 微服务网关Kong 1.0正式发布!提供100+项功能
  3. python3.8安装插件locust报错error: Microsoft Visual C++ 14.0 is required. Get it with Microsoft Visual C++
  4. Expected an Objective directive after @ 的解决办法
  5. MySQL对一行多列求和
  6. 苹果汽车项目团队添猛将?外媒称Apple Watch负责人已调入
  7. Android基础 (六) 数据存储 Part 3 SQLite数据库存储
  8. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_17_注解_解析注解...
  9. U盘修复工具哪个好?7款U盘低格工具详解
  10. IT十年人生过客-十八-路过机遇
  11. java 读取.xlsx_java 读取xlsx
  12. Datawhale组队学习周报(第026周)
  13. 5分钟搞懂什么是深度学习
  14. iOS连wifi(修改密码后的wifi)遇到的坑,纯转载
  15. 圆周率一千万亿位_圆周率一千位
  16. 基于linux的智能小车_基于ARM10与LINUX智能小车系统设计.doc
  17. 解决华为手机需要打开位置信息才能定位
  18. 我对前端开发的粗浅认知
  19. Matlab底层算法实现基于动态阈值的自动白平衡算法
  20. 信息传输计算机服务和软件行业,信息传输,软件和信息技术服务业 是 什么服务业...

热门文章

  1. (8)USB协议2——从单bit到数据包
  2. 项目搭建——Fastadmin项目搭载至虚拟空间
  3. Cell 重磅丨不依赖泛素蛋白酶降解途径的新型 PROTAC - MedChemExpress
  4. 谷歌眼镜开发Mirror API之Python开发
  5. iCAN大赛520支创新项目向世界展示“中国智造”
  6. 专访唐亘:计算机编程和数学建模缺一不可
  7. linux文件的权限已经是777了但是还是没有写入权限
  8. 土木工程转行,自学Java8个多月,终于获得一份15K的薪资
  9. JAVA计算机毕业设计宠物爱心驿站Mybatis+系统+数据库+调试部署
  10. MapReduce算法(计算出10月1日这天超速(超过120)的车辆,超速的次数,超速的详细时间)