指针函数和函数指针

news2024/9/25 11:21:30

本文目录

• 前言

• 一、返回指针的函数

二、指向函数的指针回到顶部 

一、返回指针的函数

 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。

返回指针的函数的一般形式为:类型名 * 函数名(参数列表)

 比如下面这个函数,返回一个指向char类型变量的指针

 1 // 将字符串str中的小写字母变成大写字母,并返回改变后的字符串

 2 // 注意的是:这里的参数要传字符串变量,不能传字符串常量

 3 char * upper(char *str) {

 4     // 先保留初的地址。因为等会str指向的位置会变来变去的。

 5     char *dest = str;

 6     

 7     // 如果还不是空字符

 8     while (*str != '\0') {

 9         // 如果是小写字母

10         if (*str >= 'a' && *str <= 'z') {

11             // 变为大写字母。小写和大写字母的ASCII值有个固定的差值

12             *str -= 'a' - 'A';

13         }

14         

15         // 遍历下一个字符

16         str++;

17     }

18     

19     // 返回字符串

20     return dest;

21 }

里面的代码我就不详细解释了,重点看第2行的定义形式。

调用这个函数也非常简单:

int main()

{

    // 定义一个字符串变量

    char str[] = "lmj";

    // 调用函数

    char *dest = upper(str);

    printf("%s", dest);

    return 0;

}

输出结果: LMJ

回到顶部

二、指向函数的指针

看到这个标题,你可能觉得很诧异,指针竟然可以指向一个函数,那我就先解释一下为什么指针可以指向一个函数?

1.为什么指针可以指向一个函数?

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。

2.指向函数的指针的定义

定义的一般形式:函数的返回值类型 (*指针变量名)(形式参数1, 形式参数2, ...);

注意:形式参数的变量名可以省略,甚至整个形式参数列表都可以省略

 1 #include 

 2 

 3 int sum(int a, int b) {

 4     return a + b;

 5 }

 6 

 7 int main()

 8 {

 9     // 定义一个指针变量p,指向sum函数

10     int (*p)(int a, int b) = sum;

11     // 或者 int (*p)(int, int) = sum;

12     // 或者 int (*p)() = sum;

13     

14     // 利用指针变量p调用函数

15     int result = (*p)(1, 3);

16     // 或者 int result = p(1, 3);

17     

18     printf("%d", result);

19     return 0;

20 }

* 首先在第3行定义了一个sum函数,接收2个int类型的参数,返回值类型为int

* 然后在第10行定义了一个指向sum函数的指针变量p。注意p的定义形式:int (*p)(int a, int b),第1个int代表sum函数的返回值是int类型,然后*p是用括号()包住的,后面的int a和int b代表着sum函数的形参,其实完全可以省略。第10行、11行、12行都是可行

* 在第15行,先利用*p取出指向的函数,再传入参数调用函数。也可以采用第16行中的做法,这样就跟调用普通函数没什么区别

后的输出结果:4 ,毫无意外

3.使用注意

1> 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的。难道p++就会指向下一个函数了?可笑至极!!没这回事。

2> 返回指针的函数的定义char *upper(char *str) 和 指向函数的指针的定义int (*p)(int a, int b)非常相似,使用时特别注意区分

3> 指向函数的指针变量主要有两个用途:

• 调用函数

• 将函数作为参数在函数间传递。我这么一说,可能还不是很明白,举个例子。

 1 #include 

 2 

 3 // 减法运算

 4 int minus(int a, int b) {

 5     return a - b;

 6 }

 7 

 8 // 加法运算

 9 int sum(int a, int b) {

10     return a + b;

11 }

12 

13 // 这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第1个参数决定

14 void counting( int (*p)(int, int) , int a, int b) {

15     int result = p(a, b);

16     printf("计算结果为:%d\n", result);

17 }

18 

19 int main()

20 {

21     // 进行加法运算

22     counting(sum, 6, 4);

23     

24     // 进行减法运算

25     counting(minus, 6, 4);

26     

27     return 0;

28 }

如果以后想再增加一种乘法运算,非常简单,根本不用修改counting函数的代码,只需要再增加一个乘法运算的函数

int mul(int a, int b) {

    return a * b;

}

然后counting(mul, 6, 4);就可以进行乘法运算了

对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用手机号码归属地 API 开发的应用推荐

引言 手机号码归属地 API是一种提供手机号码归属地信息的接口&#xff0c;通过该接口&#xff0c;可以获取手机号码所属的省份、城市、运营商等信息。它可以帮助企业更好地了解客户&#xff0c;为个性化推荐和精准广告投放提供数据支持。作为一种数据服务&#xff0c;手机号码…

打造高可用、高效的Nginx反向代理应用 - 实战篇

前言 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;阿里云社区博客专家&#x1f609;&#x1f609; &#x1f495; 座右铭&#xff1a; 先努力成长自己&#xff0c;再帮助更多的人 &#xff0c…

快排代码原理实现

参考博客&#xff1a;快速排序算法详解&#xff08;原理、实现和时间复杂度&#xff09; 排序算法的思想非常简单&#xff0c;在待排序的数列中&#xff0c;我们首先要找一个数字作为基准数&#xff08;这只是个专用名词&#xff09;。为了方便&#xff0c;我们一般选择第 1 个…

Java每日一练(20230504)

目录 1. 位1的个数 &#x1f31f; 2. 移除元素 &#x1f31f; 3. 验证二叉搜索树 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 位1的个数 编写一个…

推荐一个免费GIF动图下载的网站

在开发过程中难免遇到耗时操作,耗时操作往往导致线程阻塞,通常这种情况可以采用开线程的方式解决,即将耗时操作放入新线程中,同时在UI线程中加一个GIF动图即可。可作为后端开发工程师来讲单独设计一个GIF图实在是意义不大(懒+不会)。 好在现在发现了这个GIF免费下载的网站…

存储器(二)

目录 一、RAM 1.RAM特点 2.静态RAM 2.1静态RAM保存原理 2.2静态RAM基本单元电路的构成 2.3静态RAM读写操作 3.动态RAM 3.1动态RAM保存原理 3.2动态RAM基本单元电路的构成 3.3动态RAM对单元电路的读写操作 3.4动态RAM的刷新 4.静态RAM与动态RAM的比较 二、ROM 1.ROM…

WinForm对话框详解:信息框、文件对话框、功能对话框

文章目录 信息框文件对话框功能对话框 对话框是开发中经常用到的控件&#xff0c;甚至在上古的MFC编程中&#xff0c;默认就是把一个对话框编辑成窗口。winForm提供了多种不同的对话框&#xff0c;包括信息框、文件对话框、功能对话框等&#xff0c;下面逐个演示这些消息框。 …

欧姆龙PLC仿真环境搭建及通信测试

前言 欧姆龙PLC是工控领域市场率较高的品牌之一&#xff0c;有低端CP/CH系列&#xff0c;中端CJ系列&#xff0c;高端NX/NJ系列。对于上位机开发来说&#xff0c;主要的协议有Hostlink协议、FinsTCP/UDP协议、EtherNetIP协议&#xff0c;今天主要跟大家分享一下&#xff0c;我…

《互联网安全产品漏洞管理规定》

《网络产品安全漏洞管理规定》由工业和信息化部、国家互联网信息办公室、公安部联合印发&#xff0c;自2021年9月1日起施行。 该《规定》明确&#xff0c;任何组织或者个人不得利用网络产品安全漏洞从事危害网络安全的活动&#xff0c;不得非法收集、出售、发布网络产品安全漏洞…

图片png怎么转成pdf格式?

图片png怎么转成pdf格式&#xff1f;相信很多上班的小伙伴们都会遇到类似的问题&#xff0c;需要将公司的图片宣传册等资料发送给客户&#xff0c;但是公司宣传册本身是一页一页的图片文件&#xff0c;如果这样发送了就显得很不专业或者说比较杂乱&#xff01;所以&#xff0c;…

scrapy 爬虫中间件的学习

Scrapy中间件是一个处理Scrapy请求和响应的机制。中间件可以在请求或响应被Scrapy引擎处理之前或之后对其进行修改或操作&#xff0c;用于实现诸如缓存、代理、用户代理等功能。 Scrapy中间件的作用主要有以下几个方面&#xff1a; 1、对请求的处理&#xff1a;可以在请求被S…

【Spark练习】RDD分区操作

练习1&#xff1a;行动&#xff08;Action&#xff09;操作算子方法 任务1: reduce // 1. 数组 val x sc.parallelize(List(1,2,3,4)) val y x.reduce( (a,b) > a b) // 2. 列表 val rdd sc.parallelize(List(1,2,3,4)) // 求和,将各个数累加,依次合并 下面两种方式相…

读书笔记// 《数据产品经理》

书名&#xff1a;写给数据产品经理新人的工作笔记 出版时间&#xff1a;2020年10月 本书以数据产品经理角色的定位和合作关系为切入点&#xff0c;站在整个数据体系的视角&#xff0c;从工作流程的角度剖析数据需求沟通和判断的过程、指标体系搭建的过程&#xff0c;同时介绍了…

Swift 中的 async/await ——代码实例详解

前言 async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。Swift 中的并发性意味着允许多段代码同时运行。这是一个非常简化的描述&#xff0c;但它应该让你知道 Swift 中的并发性对你的应用程序的性能是多么重要。有了新的 async 方法和 await 语句&am…

《人工智能概论》课程重点总结

目录 遗传算法相关参数问题 种群规模、迭代次数、交叉率、变异率对算法的影响 A*算法中open表和close表的作用 为什么A*算法中open表是增长的 启发式函数h(n)取值的影响 A*算法可以找到最优解的条件 模式识别系统的组成 有监督学习和无监督学习的区别 模型评估三大原则…

Baklib推荐:关于建设企业知识管理的有效方法

随着信息化和互联网技术的不断发展&#xff0c;企业面临着海量的信息和知识&#xff0c;如何有效地管理和利用这些信息和知识已经成为了企业发展的关键问题之一。企业知识管理是指企业利用信息技术手段&#xff0c;对企业内部的知识进行系统化、集成化、共享化管理&#xff0c;…

MPSOC(ZU9EG/ZU15EG)PCIE架构高性能数据预处理 FMC载板设计资料

板卡概述 PCIE707 是一款基于 PCIE 总线架构的高性能数据预处理 FMC载板&#xff0c;板卡具有 1 个 FMC&#xff08;HPC&#xff09;接口&#xff0c;1 路 PCIe x4 主机接口、 1 个 RJ45 千兆以太网口、2 个 QSFP 40G 光纤接口。板卡采用 Xilinx 的高性能 UltraScale MPSOC 系…

「蓝桥杯」积木大赛

积木大赛 题目描述 春春幼儿园举办了一年一度的"积木大赛"。今年比赛的内容是搭建一座宽度为 n 的大厦&#xff0c;大厦可以看成由 n 块宽度为 1 的积木组成&#xff0c;第 i 块积木的最终高度需要是 h_i 。 在搭建开始之前&#xff0c;没有任何积木&#xff08;可…

Vue3中双向数据绑定与Pinia实践+JS数据引用的循环修改问题

Vue3 Pinia VUE3虽然出了很久了&#xff0c;但是很少深入研究&#xff0c;目前项目上遇到了一些问题&#xff0c;所以做个Note解决一下疑问&#xff1a; v-bind/v-model怎么与Pinia进行结合Object/Array数据大量处理时&#xff0c;为何有的修改不生效组合API与选项API选择 (…

赛道冠军为AI狂飙:实在智能即将重归福州,亮相第六届数字中国建设峰会

2023年4月26日至30日&#xff0c;第六届数字中国建设峰会将在福建省福州市举行。本届峰会以“加快数字中国建设&#xff0c;推进中国式现代化”为主题&#xff0c;由国家网信办、国家发展改革委、科技部、工业和信息化部、国务院国资委、福建省人民政府共同主办。 作为我国信息…