前言

当学习数组指针与指针数组的时候很是让人头疼,到底是数组还是指针?深入学习到函数的时候发现既然有函数指针指针函数这么个更让人头疼的难以区分的问题。当去看一眼定义的时候,噼里啪啦一串又长又绕,真让人崩溃!好不容易记住了结果没过几天就又忘记了,那么今天你看的这篇文章就能理解并区别两者。

函数指针

定义

简单的来说,其本质是一个指针,而该指针指向一个函数。总结来说就是:指向函数的指针

函数指针的声明

int (*fun)(int x,int y);
//该函数指针fun是一个指向返回值为整型,有两个参数并且两个参数的类型都是整型的函数

当然函数指针其本质既然是一个指针,那么赋值自然要把一个函数的地址赋值给它,有两种写法:

fun = &max;
fun = max;

很多小伙伴想这为什么不加取地址符(&)也可以?其实是每个函数的函数名就是该函数的入口地址

实例说明

//求两个整数的较大值和较小值
#include <stdio.h>
int max(int a, int b) {return a > b ? a : b;
}int min(int a, int b) {return a < b ? a : b;
}int (*fun)(int m, int n);//声明一个函数指针,该指针指向返回值为int型,有两个参数都是int的函数int main()
{int e,f;printf("请输入两个数:");scanf("%d %d",&e,&f);fun = &max;//函数指针指向较大值函数maxint c = (*fun)(e, f);printf("较大的数值是: %d \n", c);fun = min;c = fun(e, f);//函数指针指向较小值minprintf("较小的数值是: %d \n", c);return 0;
}

运行结果如下:

这里值得注意的是将一个函数赋值给函数指针时可以不加取地址符(&),同时调用函数指针也有两种不同的方式:

c = fun(e, f);
c = (*fun)(e, f);

指针函数

定义

简单的来讲就是一个返回值是一个指针的函数,其本质是一个函数,而该函数的返回值是一个指针

指针函数的声明

int *fun(int a, int b);    // 返回值为int *,指针类型的返回值

当然上述声明也可以写成以下形式:

int* f(int a, int b);

让指针标志 * 与int紧贴在一起,而与函数名fun间隔开,这样看起来就明了些了,fun是函数名,返回值类型是一个int类型的指针。指针函数就是返回一个地址给调用者。

实例说明:

#include <stdio.h>
#include <stdlib.h>
int* fun(int a,int b)//声明一个指针函数
{int *p = (int *)malloc(sizeof(int));printf("P的地址为:0x%x \n", p);if(a>b)*p=a;else*p=b;printf("*p = %d \n", *p);return p;
}
int main()
{int m,n,*q;printf("q的地址为:0x%x\n",q);printf("请输入两个数:");scanf("%d %d",&m,&n);q=fun(m,n);//调用函数指针,得到较大值的地址printf("q的地址为:0x%x\n",q);printf("较大值是:%d",*q);return 0;
}

运行结果如下:

通过函数指针得到一个指向较大值的指针,也就是地址。将该地址给调用者(q),最终得到较大值。

两者区别总结

类别 主体 作用 定义
指针函数 函数 返回一个指针 int* fun(int x,int y)
函数指针 指针 指向一个函数 int (*fun)(int x,int y);

或许记住会比较麻烦,可以这样记。括号的优先级高于星号(*),当括号里有星号时就是一个函数指针,没有则是一个指针函数,或者名字谁在后就是谁的本体(指针函数的本体是函数)当然想要深入了解还是得自己实践自己总结!
最后如果文章对你有帮助,请送我一个免费的赞呗!

不懂函数指针与指针函数?看完这篇文章就能懂相关推荐

  1. 讲的真详细!花三分钟看完这篇文章你就懂了

    前言 今年互联网形式依旧严峻,再次爆发几次大规模裁员潮.我决定把这篇文章分享出来帮助那些对前途感到迷茫的朋友.根据粉丝投稿的真实经历改编 在现在这个浮躁而又拜金的社会,我相信很多人做技术并非出于热爱, ...

  2. 秋招能有多卷?看完这篇文章你就懂了

    我从来没想过我这个专业会这么卷,卷到飞起 先说一下我们商业分析专业,无外乎两个方向:Data science方向,往数据分析走:Advisory方向,往咨询.行业分析.用户分析.战略分析走. 结果好家 ...

  3. 安卓开发文档!花三分钟看完这篇文章你就懂了!帮你突破瓶颈

    导语 2020年是转折的一年,2021年算是收获的一年,趁着金三银四开始找工作.先分享一下offer的情况 阿里高德(offer) 爱奇艺(offer) 腾讯视频(offer) 小米(被拒) 今日头条 ...

  4. 女生适合做测试吗?看完这篇文章你就懂了

    前言 在我们的传统的想法中,女生的编程思维可能会弱于男生,也导致好多女生会直接躲开编程领域,女程序员的数量也是比较少的,但是也并不是所有的IT行业女生数量都是少于男生的,比如说软件测试,那么女生做软件 ...

  5. 学物理竞赛有多难?应该怎么学?都考什么?看完这篇文章你就懂了!

    首先,要了解物理竞赛的考试形式和过程. 物理竞赛分为预赛.预赛和决赛. 初赛由全国竞赛委员会统一提案,采取笔试形式,所有中学生均可报名参加. 在初赛成绩优秀的学生从地区.市.县推荐,可以参加复赛.重赛 ...

  6. Python学了可以干嘛?到底赚钱吗?看完这篇文章你就懂了

    最近几年python越来越火,但很多小伙伴们还不知道python是什么?学习python有什么用?学会之后能做什么? 简单地说,python是最简单,最好学,零基础也可以学习的语言. 那么学pytho ...

  7. android面试必看书籍,花三分钟看完这篇文章你就懂了

    刷题 我刷题的方式都是老套路了,LeetCode+<剑指offer>,虽然老,但是效果非常不错,除此之外,再搜一搜网上的一些大厂面试题.看了很多面经.这个过程不仅是个脑力活还是体力活,由于 ...

  8. 商务智能(BI)=数据分析?才不是!看完这篇文章你就懂了

    大数据时代,商务智能风头正盛.过去传统商务智能工具独大,现在逐渐开始有越来越多的轻型BI(自助BI)出现在市场中,比如tableau和FineBI,并且占有着很大的市场份额. 于是很多企业就开始思考是 ...

  9. 日立服务器显示屏哪里买,不知道买什么面板的显示器?看完这篇文章你就懂了...

    目前市面上主流的显示器都是LCD,也就是液晶显示器,而目前市场上有许多种类的液晶显示器,比如TN屏.IPS屏还有VA屏等等.那么这些不同种类的面板究竟是在哪些地方上面有区别?各自又有什么样的特性?这篇 ...

最新文章

  1. 用C语言解“二分法求多项式单根”题
  2. Linux2.6内核--内存管理(1)--分页机制
  3. python微控制器编程从零开始-Python微控制器编程从零开始 使用MicroPython
  4. 70后、80后、90后程序员区别极端版
  5. MySQL遇到check the manual that corresponds to your MySQL server version for the right syntax错误
  6. 理解至上:数位dp(ybtoj-B数计数)
  7. 教你29招,让你在社交,职场上人人对你刮目相看
  8. SQL数据库不用SQL语句能显示全表的内容_2020别再说你了解数据库了,你搞清楚这些问题了吗?...
  9. 网站布局中遇到的一些问题
  10. Elasticsearch对接Django
  11. 易撰微信编辑器使用指南!
  12. js之如何计算两个时间的时间差
  13. android app icon素材,史上最全的APP图标模板素材以及设计格式最全的
  14. 查看twitter浏览记录_如何查看Twitter提及的通知,但不喜欢或转发
  15. poi操作word文档总结
  16. LVS负载均衡群集合集
  17. 软考是什么?考哪个科目容易过?
  18. 天猫高管全面解读大快消2018新零售打法
  19. 博弈论——序论(读书笔记)
  20. 驾校计算机计时培训管理系统,计时培训系统使用说明-驾校

热门文章

  1. AbstractInterceptor和MethodFilterInterceptor的区别
  2. java javac_JAVA和JAVAC 命令详细介绍
  3. 快递鸟Java 接入
  4. 《那些年啊,那些事——一个程序员的奋斗史》十二
  5. JAVA 注册 HUANXIN 即时通信
  6. 周鸿祎:互联网的过去、现在和未来
  7. 少儿机器人编程主要使用的语言有啥
  8. 加一度强烈推荐:信息流广告精准投放大杀器
  9. 蓝牙耳机哪款性价比高一些?2023年性价比最高的蓝牙耳机推荐
  10. 我的科幻评论——《天年》:瑰丽的中国风末日小说