当前位置: 首页 > news >正文

指针函数与函数指针的区别

   辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

 

1、指针函数:本质是一个函数。函数返回类型是某一类型的指针。只是函数的返回值

    格式:  类型标识符    *函数名(参数表)

                   int *f(x,y);

 

1
2
3
4
5
float  *fun();
 
float  *p;
 
p = fun(a);

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int * find( void );
 
int  * find(){
 
      int  *pp ;
       pp= 0;
     return  pp;
     
}
 
int  main( int  argc,  const  char  * argv[]) {
 
     int  *pp ;
     pp = find();
 
     return  0;
}

 本质是函数 只是这个函数返回的是一个执行某一类型数据的指针;

 

2、函数指针是指向函数的指针变量,即本质是一个指针变量。-指向的是函数的实现地址

     格式:类型说明符 (*函数名)(参数)

                int (*f) (int x); 

    指向函数的指针包含了函数的地址,可以通过它来调用函数

   其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数实现地址。指针的声明笔削和它指向函数的声明保持一致。

 

1
2
3
4
5
6
7
8
9
10
11
12
int   xMax( int  a, int  b){
     return  a>b?a:b;
     
}
int  main( int  argc,  const  char  * argv[]) {
 
     
     int  (*xMaxValue)( int  a, int  b) = &xMax; // &可以省略
     
     int  d = xMaxValue(xMaxValue(2,4),3);
     printf( "最大的数字是: %d\n" , d);
}

 

   

  指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

3、回调函数

函数指针作为某个函数的参数

 

函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。

简单讲:回调函数是由别人的函数执行时调用你实现的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 回调函数
void  populate_array( int  *array, size_t arraySize,  int  (*getNextValue)( void ))
{
     for  (size_t i=0; i<arraySize; i++)
         array[i] = getNextValue();
}
  
// 获取随机值
int  getNextRandomValue( void )
{
     return  rand();
}
  
int  main( void )
{
     int  myarray[10];
     populate_array(myarray, 10, getNextRandomValue);
     for ( int  i = 0; i < 10; i++) {
         printf( "%d " , myarray[i]);
     }
     printf( "\n" );
     return  0;
}

转载于:https://www.cnblogs.com/jack-hzm/p/9950477.html

相关文章:

  • IntelliJ IDEA 配置JDK
  • Jmeter (八) 脚本增强_事物
  • 为django项目配置celery的后台启动
  • 用Python表达对Android的想法
  • vue页面与状态机,一些设想与实践
  • KVM web管理工具——WebVirtMgr(一)
  • 关于字符串格式化
  • 在小程序中打开普通二维码
  • 网站资源【珍藏版】
  • 四则运算
  • 131-三元运算符
  • JDK、Tomcat、Eclipse安装和配置。。。
  • Pyhon 中文编码问题(字符串前加‘U’)
  • java数据结构基本框架
  • linux_用户以及权限
  • [译]CSS 居中(Center)方法大合集
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Brief introduction of how to 'Call, Apply and Bind'
  • Cumulo 的 ClojureScript 模块已经成型
  • Git学习与使用心得(1)—— 初始化
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript学习总结——原型
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JAVA之继承和多态
  • node入门
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0项目引入element-ui
  • Vue学习第二天
  • Web标准制定过程
  • Yii源码解读-服务定位器(Service Locator)
  • 百度地图API标注+时间轴组件
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 浏览器缓存机制分析
  • 马上搞懂 GeoJSON
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何实现 font-size 的响应式
  • 深入浅出webpack学习(1)--核心概念
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 译自由幺半群
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ionic异常记录
  • 阿里云服务器购买完整流程
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • #android不同版本废弃api,新api。
  • #ifdef 的技巧用法
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #Lua:Lua调用C++生成的DLL库
  • #考研#计算机文化知识1(局域网及网络互联)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (规划)24届春招和25届暑假实习路线准备规划
  • (七)c52学习之旅-中断
  • (十六)串口UART