news 2026/6/29 22:32:22

使用typedef封装函数指针新类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用typedef封装函数指针新类型

typedef的用法是在定义前加上这个关键字,就能得到一个新的类型名;例如int a;变成typedef int a ;那么就可以用a表示Int了。

比如void (*test)(void);那么加上typedef就变成了typedef void (*test)(void);

类型名test就表示一个返回值是void参数是void的一个函数指针类型,与上面的int a不同这里的变量名是test

void test_opr(void) {}; typedef void (*test)(void); test ptr = test_opr; ptr();

void test(void);这个函数声明表示定义了一个参数为void,返回空的test函数。

并且这里面的test的值就是存储函数指针,也就是这个函数的第一条语句的内存地址。

*为解引用操作,对函数进行解引用操作,*test按道理讲要返回函数内容也就是函数体,但是事实上没法返回函数体。就对解引用降级(退化),所以test和*test以及**test不管多少个解引用,结果都是这个函数的内存地址。但还是注意test和*test本质上是不一样的,一个是函数指针存储函数的第一条汇编指令的内存地址,一个是这个函数的函数体,在输出的时候会隐式退化成test。

#include <stdio.h> static int count = 0; void test(void) { printf("test count %d task start\n", count++); } void (*test_por)(void) = test; int main() { printf("test value 0x%X, *test value 0x%X **test value 0x%X &test value 0x%X\n", test, *test, **test, &test); test(); (*test)(); (**test)(); (*test_por)(); (&test)(); //(&test_por)(); //注意此时这个test_por是存储函数内存地址的容器,也就是说&test_por获取到的是存储函数内存地址的地址所以可以看到后面输出的&test_por地址和test_por不同。也就是说,test_por存储的内存数据,&test_por是存储这个数据的内存地址 //事实上,test_por存储的是函数体的第一条指令的地址 printf("test_por value 0x%X, *test_por value 0x%X **test_por value 0x%X &test_por value 0x%X\n", test_por, *test_por, **test_por, &test_por); while(1) { } return 0; }

输出的结果也能证实:

test value 0x681F14A4, *test value 0x681F14A4 **test value 0x681F14A4 &test value 0x681F14A4 test count 0 task start test count 1 task start test count 2 task start test count 3 task start test count 4 task start test_por value 0x681F14A4, *test_por value 0x681F14A4 **test_por value 0x681F14A4 &test_por value 0x681F9000
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 22:28:59

AFE5808评估板实战指南:从硬件配置到动态性能测试

1. 项目概述与核心价值在医疗超声、工业无损检测或者高端通信接收机这类对模拟信号完整性要求极高的领域&#xff0c;选型一颗高性能的模拟前端&#xff08;AFE&#xff09;芯片只是第一步。真正的挑战在于&#xff0c;如何在实际的电路板上验证这颗芯片是否真的能达到数据手册…

作者头像 李华
网站建设 2026/6/29 22:22:36

3D Web 服务器环境搭建

一、Ubuntu安装nodejs# 导入源 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - # 安装 sudo apt install nodejs -y //安装包管理器&#xff08;1&#xff09;curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - 导入源的作用&…

作者头像 李华
网站建设 2026/6/29 22:18:48

leetcode:两个数组的交集

class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> s1(nums1.begin(),nums1.end());//set自动会去重和排序set<int> s2;vector<int> v;//去s1里面找有没有nums2里面的数据for…

作者头像 李华
网站建设 2026/6/29 22:14:59

2026年AI写作辅助平台测评:5款神器从选题到格式全流程护航

写论文的焦虑&#xff0c;是每个科研人和学生都无法回避的“必修课”。选题无从下手&#xff0c;文献检索耗时费力&#xff0c;格式排版反复修改&#xff0c;查重降重更是让人抓耳挠腮。2026年的AI工具&#xff0c;早已不再是冷冰冰的“文字机器”&#xff0c;而是变成了能理解…

作者头像 李华
网站建设 2026/6/29 22:09:34

【RV1103/RV1106】基于Buildroot定制蓝牙文件系统:从依赖解析到实战排错

1. 为什么选择Buildroot构建蓝牙文件系统 在嵌入式开发中&#xff0c;文件系统的构建一直是个让人头疼的问题。特别是当我们需要为RV1103/RV1106这类资源受限的平台添加蓝牙支持时&#xff0c;传统的编译方式往往会遇到各种依赖地狱。Buildroot的出现&#xff0c;就像给开发者递…

作者头像 李华
网站建设 2026/6/29 22:07:21

芝麻粒TK版:让蚂蚁森林能量管理变得轻松简单的智能助手

芝麻粒TK版&#xff1a;让蚂蚁森林能量管理变得轻松简单的智能助手 【免费下载链接】Sesame-TK 芝麻粒TK版 项目地址: https://gitcode.com/gh_mirrors/se/Sesame-TK 蚂蚁森林作为支付宝最受欢迎的环保功能&#xff0c;让数亿用户通过日常低碳行为收集能量&#xff0c;为…

作者头像 李华