函数指针、指针函数以及其他复杂类型定义

news/2025/3/10 20:17:09/文章来源:https://www.cnblogs.com/fuhao2/p/18762263

1.0 函数指针

1.1 函数指针的定义

  函数指针是指向函数的指针变量。它的本质是一个指针变量,该指针指向一个函数。函数指针可以像一般函数一样,用于调用函数、传递参数。

1.2 函数指针的声明

int (*fun)(int x,int y);
或者
int (*fun)(int, int); // 一般用这种

1.3 函数指针的赋值

int max(int x, int y)
{return x > y ? x : y;
}
int (* fun)(int, int) = & max; // &可以省略,取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址。// 或者配合typedef使用
typedef int (*fun_ptr)(int, int); // //等价于 int(*)(int, int) 这个类型用fun_ptr来简短表示 
int main() {fun_ptr fp = max; // 将函数max的地址赋值给函数指针fpint result = fp(3, 4); // 通过函数指针调用函数printf("Result: %d\n", result); // 输出结果 4return 0;
}

1.4 函数指针的调用方式

x = (*fun)(); 
或者
x = fun();

1.5 函数指针的常见用途

  函数指针常用于回调函数。函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
简单讲:回调函数是由别人的函数执行时调用你实现的函数。

以下是来自知乎作者常溪玲的解说:你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。 
#include <stdlib.h>  
#include <stdio.h>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];/* getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/populate_array(myarray, 10, getNextRandomValue);for(int i = 0; i < 10; i++) {printf("%d ", myarray[i]);}printf("\n");return 0;
}

1.6 函数指针的作为函数返回值的写法

int (*fun(int x, int y))(int, int);  // fun函数入参为两个int,返回参数为一个函数指针,该函数指针接受两个int,返回一个int。

2.0 指针函数

  指针函数是指返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。写法如下:

int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);

3.0 复杂类型定义

  右左原则:以变量为中心,先向右解析再向左解析。

3.1 定义⼀个指向指针的指针,它指向的指针是指向⼀个整型数(A pointer to a pointer to an integer)

int **a;

3.2 定义⼀个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

int (*a)[10];

3.3 定义⼀个有10个指针的数组,该指针指向⼀个函数,该函数有⼀个整型参数并返回⼀个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

int (*a[10])(int);

参考

  • 【嵌入式八股文面试题合集-嵌入式工程师笔试面试100题 校招社招必备 嵌入式开发/Linux/STM32单片机/C语言/C++/Qt/秋招春招/FreeRTOS】 https://www.bilibili.com/video/BV17n6PY7EYB/?share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91
  • https://blog.csdn.net/luoyayun361/article/details/80428882
  • https://blog.csdn.net/qq_27825451/article/details/103081289
  • https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
  • 【嵌入式C语言高阶版】 https://www.bilibili.com/video/BV1qCSkY7EyD/?p=72&share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构造矩形

构造矩形 题目描述 现有 \(n\) 条长度为 \(m\) 的线段,垂直于 x 轴分布,且互不重合。第 \(i\) 条线段的两个端点均为整数点,分别为 \((a_i, 0)\) 和 \((a_i, m)\)。每条线段上有 \(m+1\) 个整数点,纵坐标分别为 \(0, 1, 2, …, m\)。 现在,你需要选择两条不同的线段,并在…

Llama 4 即将发布,引入语音能力;AI 智能运动眼镜 BleeqUp:实时对讲、AI 自动成片等功能丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

BigDecimal类--java进阶day05

1.BigDecimal出现的原因2.BigDecimal的创建不推荐第一种形式,会有误差第二种方式创建对象第三种方式调用方法2.BigDecimal常用方法除法的特殊事项 如果有除不尽的情况,常规的除法会出现问题divide的另一种方法 divide还有一个重载方法,可以解决除不尽的问题舍入模式中,进一…

3.10 学习记录

实现了员工页面的前端代码实现点击查看代码 <script setup> import { ref, onMounted } from vue import axios from axiosconst searchEmp = ref({name: ,gender: ,job: , })onMounted(() => {search(); })const search = async () => {const url = `https://web-…

transformer 中的掩码类型

知识是我们已知的也是我们未知的基于已有的知识之上我们去发现未知的由此,知识得到扩充我们获得的知识越多未知的知识就会更多因而,知识扩充永无止境

如何设计、维护和推广 API:专业人士的实用指南

API 在今天的数字化环境中扮演着至关重要的角色,它们作为系统和应用程序之间的连接纽带。对于公司而言,打造用户喜爱的 API、有效地维护它们并成功地在内部和外部推广,不仅能提高数字价值,还能带来巨大的业务收益。 API 设计是创建一个标准化、易于理解且稳定的应用程序接口…

springboot引入nacos

springboot引入nacos 一、 环境准备(windows为例)安装nacos(github镜像网址:Releases alibaba/nacos) 推荐下载发行版启动nacos本地服务 下载完毕,建议解压到没有中文路径的文件夹,在bin目录下打开cmd对话框输入下面命令启动nacos startup.cmd -m standalone启动成功出现以…

95%开发者不知道的调试黑科技:Apipost让WebSocket开发效率翻倍的秘密

在现代 Web 开发中,Websocket 作为一种常见的 Web 协议,与 Restful API 有着本质的不同。Restful API是基于请求-响应模式的单向通信,而 WebSocket 提供全双工通信渠道,允许客户端和服务器之间进行实时双向数据传输。这种特性使得它在需要实时交互的场景中大放异彩,比如 I…

题解:P9221 「TAOI-1」Pentiment

P9221 解题报告 一眼线段树优化 dp,但是调了7h。 首先考虑朴素 dp,设 \(dp_{i,j}\) 表示走到第 \(i\) 行第 \(j\) 列的方案数,转移: \[dp_{i,j}=\sum dp_{i-1,k} \]其中 \(k\) 表示第 \(i\) 行可以走到 \(j\) 的列。 比如如果第 \(i\) 行是下面这种情况:当 \(j=3\) 时,\(…

【Java开发】Tools4AI:一个适用于企业Java应用的开源智能体框架

一、简介 GitHub主页:(https://github.com/vishalmysore/Tools4AI) Tools4AI 是一个基于 Java 的开源智能体框架,它为企业Java应用程序提供了一种集成人工智能的独特方法。作为一个大型动作模型(Large Action Model,LAM)智能体,Tools4AI 能够根据自然语言指令自主执行任务…

英语328个词缀和词根汇总(14张图)

在所有的单词记忆法中,构词法是最科学、记忆效果最佳的词汇记忆法。下面整理了高中常用的词根、词缀。利用有限的词根、词缀对英语单词进行构词分析和解形释义,单词变得好认又好记,词义也一目了然。通过构词法记单词,可以举一反三,记一识十,从而达到事半功倍的记忆效果。…