我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言指向函数的指针实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言指向函数的指针实例分析

这篇文章主要介绍“C语言指向函数的指针实例分析”,在日常操作中,相信很多人在C语言指向函数的指针实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指向函数的指针实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、函数的指针

首先,函数名代表函数的起始地址,调用函数时,程序会从函数名获取到函数起始地址,并从该地址起执行函数中的代码,函数名就是函数的指针,所以我们可以定义一个指向函数的指针变量,用来存放函数的起始地址,这样一来,就可以通过该变量来调用其所指向的函数。

二、指向函数的指针变量

定义指向函数的指针变量

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

例如:int(*p)(int, int);,这行代码定义了一个可以指向返回值为整型且有两个整型形参函数的指针变量p,符合返回值为整型且有两个整型形参的函数都可以将其地址(即其函数名)赋给p。

使用指向函数的指针变量

在使用指向函数的指针变量时,只需要将函数名赋给指向函数的指针变量即可,因为函数名就是该函数的入口地址。

由于指向函数的指针变量保存了函数的地址,则该指针变量就指向了对应的函数。例如,求最大值的函数命名为max,如果将其函数名赋给指向函数的指针变量p(即p = max)后,则p就指向了max函数,并且可以通过(*p)(a, b);的方式来调用max函数,因为指针变量p保存了max函数的地址,那么*p就是max。需要注意的是,其中*p前的*可以省略,故也可以写成p(a, b);

三、调用函数的两种方式

引例:自定义max函数,求整数ab中的较大者并返回给主调函数,不考虑两数相等的情况通过函数名调用函数

#include <stdio.h>int max(int, int); // max函数的函数声明int main(){int a, b;printf("请输入两个整数:");scanf("%d%d", &a, &b);printf("两数中的较大者的值为%d\n", max(a, b));return 0;}int max(int a, int b){if (a > b)return a;elsereturn b;}

通过指向函数的指针变量调用函数

#include <stdio.h>int max(int, int); // max函数的函数声明int main(){int a, b;int(*p)(int, int); // 定义指向函数的指针pp = max; // p指向max函数printf("请输入两个整数:");scanf("%d%d", &a, &b);printf("两数中的较大者的值为%d\n", (*p)(a, b)); // (*p)(a, b) 也可写为 p(a, b)return 0;}int max(int a, int b){if (a > b)return a;elsereturn b;}

四、指向函数的指针的作用

看到这里有人可能会问,既然函数名就可以调用函数,为什么还要弄个奇奇怪怪的指针?这难道不是多此一举嘛?难倒是为了装13?不管怎样,使用指向函数的指针来调用函数肯定不是为了装13,主要的原因是:用函数名调用函数时比较死板,只能调用所指定的一个函数,而通过指针变量调用函数会比较灵活,可以根据不同的情况调用不同的函数。以下面的程序为例: 输入两个整数,然后让用户选择1或2,选1则调用max函数求出两个整数的较大者并将其输出,选2则调用min函数求出两个整数的较小者并将其输出,不考虑两数相等的情况

#include <stdio.h>int max(int, int); // max函数的函数声明int min(int, int); // min函数的函数声明int main(){int a, b, c, n;int (*p)(int, int); // 定义指向函数的指针pp = NULL; // 先将p赋为空printf("请输入两个整数:");scanf("%d%d", &a, &b);printf("输入1获取两个数中的较大者,输入2获取两个数中的较小者,请输入:");scanf("%d", &n);if (n == 1)p = max; // p指向max函数else if (n == 2)p = min; // p指向min函数c = p(a, b); // 调用p所指向的函数if (n == 1)printf("两个数中的较大者为:%d\n", c);elseprintf("两个数中的较小者为:%d\n", c);return 0;}int max(int a, int b){if (a > b)return a;elsereturn b;}int min(int a, int b){if (a < b)return a;elsereturn b;}

五、用指向函数的指针作函数参数(重点)

指向函数的指针变量的一个重要用途是把函数的入口地址作为实参传递给其他函数。以下面的程序为例:

有两个整数ab,由用户输入1,2,3来决定进行什么操作。输入1则求出ab中的较大者,输入2则求出ab中的较小者,输入3则求出ab之和,不考虑两个数相等的情况

#include <stdio.h>int fun(int, int, int (*p)(int, int));int max(int, int);int min(int, int);int sum(int, int);int main(){int a = 34, b = -21, n;printf("输入1获得两数中的较大者,输入2获得两数中的较小者,输入3获得两个数的和,请输入:");scanf("%d", &n);if (n == 1)printf("两数中的较大者为%d\n", fun(a, b, max)); // 向fun函数中传参时,只需要传入两个整数或整型变量以及想要在fun函数内执行的函数的函数名即可// 函数名会传递给对应的形参指针变量else if (n == 2)printf("两数中的较小者为%d\n", fun(a, b, min));else if (n == 3)printf("两个数的和为%d\n", fun(a, b, sum));return 0;}// fun函数的作用是获取最终结果int fun(int x, int y, int (*p)(int, int)){int result;result = p(x, y); // 用result接收最终结果,不管执行max,min,sum中的哪个函数,fun函数内部代码都不用改变return result;}int max(int x, int y){if (x > y)return x;elsereturn y;}int min(int x, int y){if (x < y)return x;elsereturn y;}int sum(int x, int y){return x + y;}

从上面的程序中可以清晰地看出,不管调用maxminsum中的哪个函数,fun函数均没有任何变化,在fun函数内部的result只用来获取结果并将结果返回,但不去判断到底要通过哪个函数来计算这一结果,主调函数向其传入哪个函数,其内部就执行哪个函数。maxminsum函数用来计算,fun函数用来获取结果,这体现出了整个程序的模块化。

六、为什么要将指向函数的指针变量作为函数的形参(重点)

举一个例子,我们在学习数组的过程中,想要把数组中的所有元素输出,通常会接触一个新词,遍历。其实遍历的含义并不是将一个结构中的元素输出的过程,然而我在初学时便认为遍历等同于输出,这是我在初学时对遍历这个词不准确的理解,我相信也一定有人跟我一样这样认为。其实遍历指的是依次访问某种结构中的所有元素,至于对这些元素怎么操作,由程序员自己决定,比如,你想输出所有的元素,那就可以调用输出函数将每次获取到的元素输出;你想将所有元素的值翻倍,那就调用对应的翻倍函数将每次获取到的元素翻倍。但是这样一来,遍历函数的功能就变得十分单一,只能进行一种操作,要么是遍历并输出,要么是遍历并翻倍,如果在一个程序中,开始想要遍历并翻倍,后又想要遍历并输出,就只能定义两个函数来实现,但是我们发现不管对元素怎么操作,访问每个元素的代码都是相同,并且只要想对结构中的每个元素进行操作,首先要做的就是访问每个元素。但是如果为了输出而定义一个先遍历后输出的函数,为了将每个元素的值翻倍而定义一个先遍历后翻倍的函数,这样遍历元素的代码就是重复的。那要怎么办呢?既然遍历的操作是重复的,那我们就定义一个专门的遍历函数,该函数只用来访问元素,再定义其它多个操作数据的函数,至于我们对遍历后的数据执行什么样的操作,我们只需要将对应的操作函数通过遍历函数的形参接收过来,这样就可以实现在遍历函数中根据不同情况执行不同操作的目的,如此一来既体现出了程序设计的结构化与模块化,又减少了编程时的代码量。

到此,关于“C语言指向函数的指针实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言指向函数的指针实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言指向函数的指针实例分析

这篇文章主要介绍“C语言指向函数的指针实例分析”,在日常操作中,相信很多人在C语言指向函数的指针实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指向函数的指针实例分析”的疑惑有所帮助!接下来,请跟
2023-07-02

C语言指针应用实例分析

这篇文章主要讲解了“C语言指针应用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言指针应用实例分析”吧!1、指针是什么指针理解的2个要点:平时口语中说的指针,通常指的是指针变量,
2023-06-30

C语言指针运算实例分析

这篇文章主要介绍“C语言指针运算实例分析”,在日常操作中,相信很多人在C语言指针运算实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针运算实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-30

C语言指针使用实例分析

今天小编给大家分享一下C语言指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为指针指针这玩意说白了,就是用来
2023-07-02

C语言中返回值指针函数的示例分析

这篇文章主要为大家展示了“C语言中返回值指针函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中返回值指针函数的示例分析”这篇文章吧。 #includevo
2023-06-29

C语言函数传参:指针的指针

今天同事问了一个问题:在函数参数中传递指针的指针,很常用的一个场景,重新梳理一下记录于此,以后如果有类似的问题直接发这篇小总结就可以了。

C语言指针和数组应用实例分析

这篇文章主要介绍“C语言指针和数组应用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言指针和数组应用实例分析”文章能帮助大家解决问题。一、指针和数组分析-上1.数组的本质数组是一段连续的
2023-06-30

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
2022-11-15

C语言结构体指针的示例分析

这篇文章给大家分享的是有关C语言结构体指针的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。写结构体指针前,先说一下 . 号和 -> 的区别记得当初刚学C语言的时候,搞不清结构体的 . 号和 -> ,经常混
2023-06-20

c语言怎么向函数传递数组指针

在C语言中,可以通过指针的方式向函数传递数组指针。以下是一个示例代码:#include void printArray(int* arr, int size) {for (int i = 0; i 在上面的代码中,`printArray
2023-10-25

C语言中如何使用指针函数和函数指针

这篇文章给大家介绍C语言中如何使用指针函数和函数指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、指针函数当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。格式:
2023-06-17

C++的this指针实例分析

这篇文章主要介绍了C++的this指针实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++的this指针实例分析文章都会有所收获,下面我们一起来看看吧。this指针是存在与类的成员函数中,指向被调用函数
2023-06-27

C++中指针实例分析

这篇文章主要介绍“C++中指针实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中指针实例分析”文章能帮助大家解决问题。计算机的内存模型CPU是计算机的核心部件,要想让一个CPU工作,就必
2023-06-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录