C语言之函数指针(持续更新)

C语言精髓是指针,指针知识深似海,遇到一些学习一些~


文章目录

  • 1. typedef 定义函数指针类型
  • 2. void* 空指针的解引用

1. typedef 定义函数指针类型

函数参数化是指通过函数指针将函数的某些行为参数化。这样,我们可以在调用函数时动态地指定函数的行为。以下是一个示例:

#include <stdio.h>void process_array(int *array, size_t size, int (*process)(int))
{for(size_t i = 0; i < size; i++){array[i] = process(array[i]);}
}int increment(int n)
{return n * 2;
}int main()
{int array[] = {1, 2, 3, 4, 5};size_t size = sizeof(array) / sizeof(int);process_array(array, size, increment);for(size_t i =0; i < size; i++){printf("%d", array[i]);}printf("\n");return 0;
}

如果通过typedef来定义函数指针类型:

#include <stdio.h>typedef int (*process_t)(int);void process_array(int *array, size_t size, process_t process)
{for(size_t i = 0; i < size; i++){array[i] = process(array[i]);}
}int increment(int n)
{return n * 2;
}int main()
{int array[] = {1, 2, 3, 4, 5};size_t size = sizeof(array) / sizeof(int);process_array(array, size, increment);for(size_t i =0; i < size; i++){printf("%d", array[i]);}printf("\n");return 0;
}

定义的 process_array 函数接受三个参数:一个整型数组、数组大小、一个函数指针。函数指针指向一个函数,该函数接受一个整型参数并返回一个整型结果因此,当执行到 array[i] = process(array[i]); 时,process函数会自动调用increment函数。
有人可能会问了:“那如果我再定义一个函数:int aaaa(int x){return x + 1;}呢?process 函数会调用哪个函数?”。
这样符合 process_t 类型的函数就有多个了,我们可以将 process 指针指向某个函数,比如:

process_t process = aaaa; // 设置 process 指针指向 aaaa 函数
process_array(array, size, process);

2. void* 空指针的解引用

首先定义一个uint32_t 类型的param_value ,其值为0xa5a5,现在已经通过某种方法将 param_value 的地址指针传入了函数 sys_manager_handler 中(第三个参数),我们需要关注的是如何在函数内使用printf将 param_value 这个值打印出来。
在printf中,应该使用何种占位符?param作为一个指针又应该如何变换?
伪代码如下:

uint32_t param_value = 0xa5a5;int sys_manager_handler(void *cobj, uint32_t event_id, void *param)
{printf("we got value from event:%lx", *(uint32_t *)param);printf("sys_manger got value from event:%lx", *param);
}

以上两句 printf 哪个正确?
由于我们知道,传入函数的第三个参数 param 是一个指向 param_value 地址的指针,所以我们在 printf 中的变量处需要对 param 指针进行解引用,得到一个 uint32_t 类型的变量,对应的占位符使用 %lx 就好啦。
但其实直接对 param 进行解引用是不对的,因为:

  • void * 类型的指针可以指向任何类型的数据,对应地,这样的指针并没有具体的类型信息,所以编译器也不知道它指向的数据的类型和大小。
  • 当需要访问void *指针所指向的数据时,必须先将其转换为具体的指针类型,然后才能解引用。

综上,正确的是第一句。

printf("we got value from event:%lx", *(uint32_t *)param);

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

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

相关文章

【每日刷题】Day48

【每日刷题】Day48 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 872. 叶子相似的树 - 力扣&#xff08;LeetCode&#xff09; 2. 114. 二叉树展开为链表 - 力扣&…

react中怎么为props设置默认值

在React中&#xff0c;你可以使用ES6的类属性&#xff08;class properties&#xff09;或者函数组件中的默认参数&#xff08;default parameters&#xff09;来定义props的默认值。 1.类组件中定义默认props 对于类组件&#xff0c;你可以在组件内部使用defaultProps属性来…

如何撰写EI会议的投稿信?

撰写EI会议的投稿信&#xff08;Cover Letter&#xff09;是向会议组织者介绍你的论文和研究工作的一个重要环节。以下是撰写投稿信的一些关键步骤和建议&#xff1a; 投稿信的结构 信头 你的信息&#xff1a;包括姓名、职位、单位名称、通讯地址、电子邮件和电话号码。日期&am…

力扣652. 寻找重复的子树

Problem: 652. 寻找重复的子树 文章目录 题目描述思路复杂度Code 题目描述 思路 1.利用二叉树的后序遍历将原始的二叉树序列化&#xff08;之所以利用后序遍历是因为其在归的过程中是会携带左右子树的节点信息,而这些节点信息正是该解法要利用的东西&#xff09;&#xff1b; 2…

js积累二(web页面实现 时间走秒)

<tr><td class"ys04"><span class"ys02">当前时间&#xff1a;</span></td><td colspan"2"><span class"showTime"></span><script>var t null;t setTimeout(time, 1000); /…

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

Windows11的这个地方暴露着你的隐私,把它关掉避免尴尬

前言 现在的电脑真的是越来越智能化&#xff01;现在有很多小伙伴都是用着Windows11的吧&#xff01;用习惯了Windows11之后&#xff0c;突然发现它还是挺顺手的。 但不知道你有没有发现&#xff0c;Windows11上面有个地方暴露着你的隐私。这个隐私可能是某个小姐姐的图片&am…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 在HTML中&#xff0c;如果使用一些特定的属性名&#xff08;如id或name&#xff09;给DOM元素命名&#xff0c;这些属性会在全局作用域中创建同名的全局变量&#xff0c;指向对…

算法:最大连续子序列和

53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 class Solution:def maxSubArray(self, nums: List[int]) -> int:a…

Vue $nextTick作⽤是什么怎么使用

Vue中的$nextTick是一个非常重要的方法&#xff0c;主要用于在DOM更新后执行延迟回调。其工作原理基于Vue的异步更新队列机制。 当你在Vue实例上修改数据后&#xff0c;Vue并不会立即更新DOM&#xff0c;而是将这些修改操作推入一个队列中&#xff0c;并在下一个事件循环的“t…

Shell | shell脚本中使用cp指令(外两则)

sample"ENCFF253NIN" #等号两侧避免使用空格 source_path"/home/xxzhang/workplace/project/CRISPRa/Pacbio/CCS_TE.2/" target_path"./" cp "$source_path"/00-common_all.vcf.gz "$target_path" cp "$source_path&qu…

如何在Python中实现迭代器和可迭代对象

在Python中&#xff0c;可迭代对象&#xff08;iterable&#xff09;是一个对象&#xff0c;它可以返回一个迭代器&#xff08;iterator&#xff09;用于遍历其元素。迭代器是一个对象&#xff0c;它有一个 __next__() 方法&#xff08;在Python 2中&#xff0c;它是 next() 方…

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码 1、用户管理1.1、添加用户1.2、编辑用户1.3、关联通道1.4、重置密码1.5、搜索1.6、删除 2、搭建GB28181视频直播平台 1、用户管理 1.1、添加用户 添加用户&#xff0c;可以配置登陆用户…

STM32-按键控制LED

接上篇LED点亮;http://t.csdnimg.cn/9r6z7 目录 一.硬件设计 二.软件设计 三.完整代码 四.结束语 一.硬件设计 按钮接电源插入PB0引脚,如上图所示 二.软件设计 void key_init() {GPIO_InitTypeDef GPIO_InitStruct;//使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…

【LeetCode:496. 下一个更大元素 I + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

问题解决记录1:nvidia-container-cli: initialization error: load library failed

本地docker运行 $ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi 遇到这种报错 Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error dur…

案例分享|Alluxio在自动驾驶模型训练中的应用与部署

分享嘉宾&#xff1a; 杨林三-辉羲智能 关于辉羲智能&#xff1a; 辉羲智能致力打造创新车载智能计算平台&#xff0c;提供高阶智能驾驶芯片、易用开放工具链及全栈自动驾驶解决方案&#xff0c;运用独创性“数据闭环定义芯片”方法学&#xff0c;助力车企构建低成本、大规模和…

百度生成数据库

问题1&#xff1a; 帮我创建2个表student与score表&#xff0c;要求student表有id,createDate,userName,phone,age,sex,introduce&#xff0c; 要求score表有id,scoreName,result,studentId(student表的id外键)。 要求student表中插入5条学生信息&#xff0c;都要是中文的。 要…

docker flow

docker --version docker build -t tagname:version docker run --networknetwork --namename -p port:port imageName docker rmi docker rm docker images docker rm docker start docker stop

设计模式5——抽象工厂模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 抽象工厂模式&#xff08;Abst…