通俗易懂详解typedef函数指针

2023-10-29

1 函数指针

第一个问题,搞清楚函数指针,必须知道函数指针的实质是一个是一个指针,并不是函数,函数有自己的函数体,而指针只是一个变量,也就比如我们常声明的int a = 0中的a一样。

细致的讲,如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针

举个例子:

int(*p)(int, int);

这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。

所以就有了函数指针的定义方式:

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

那么问题来了,定义一个变量,他的类型是什么呢,这里把变量名去掉,就是他的类型,也就是下面:

int(*)(int,int);

请记住这个类型很重要,不然你很难理解下面说的typedef。

第二个问题,怎么使用刚才定义的这个函数指针呢。

举个例子:

void Func(int x) // 声明一个函数*/
{
    printf("%d",x);
}
void (*p) (int) // 定义一个函数指针*/
p = Func; // 将Func函数的首地址赋给指针变量p*/
(*p)(a);  // 通过函数指针调用Func函数

2 彻底理解typedef函数指针

网上看了很多不理解这个typedef的用法,刚才也强调了函数指针的类型。下面说说这个typedef。

格式如下:

typedef char (*p)(int); 

是不是看着有点懵,因为没有用一般的 typedef 源类型 字面类型名; 的表达方式。

这里是把定义了一个别名叫(*p)(int)吗,显然不对,其含义是:

要定义的类型是char (*)(int),即参数一个int,返回char的函数指针,定义的别名是p。

举个例子:

typedef char (*p)(int);   
p pFun;   
char glFun(int a){ return;}   
void main()   
{   
    pFun = glFun;   
    (*pFun)(2);   
} 

第一句就是定义了一种p的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用p了。

第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用上面函数指针的格式一样使用这个变量了。

补充:类似的,定义数组指针的别名就是typedef int (*int_arr_pnt)[4];

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通俗易懂详解typedef函数指针 的相关文章

  • java学习总结(三),socket和NIO

    Socket 概念 两个程序 进程 通过一个双向通信连接实现数据交换 这个双向连接的一端是一个socket 套接字 分类 1 面向连接 TCP 2 面向无连接 udp 结构 每一个socket都是由ip地址和端口号唯一确定的 生命周期 打开
  • Windows10家庭版使用LxRunOffline工具迁移子系统和docker发行版到其他盘符防止系统盘爆满

    1 下载LxRunOffline工具 2 解压到一个自己平时安装软件的目录 并配置环境变量 重启电脑 打开命令行工具 输入LxRunOffline 如果显示下面的提示证明已经安装成功了 c 2019 Microsoft Corporatio
  • springboot整合shiro

    文章目录 springboot 整合shiro 一 shiro是什么 二 与springboot的整合 1 前期准备 2 ShiroConfiger配置类 3 过滤 拦截 4 认证 5 授权 6 注销 7 显示问题 登录 注销同时显示 无权

随机推荐

  • GitHub新手使用教学(从安装到使用)

    一 安装Git for Windows 又名msysgit 下载地址 https git for windows github io 在官方下载完后 安装到Windows Explorer integration的时候 将选项中将 Git
  • successfulHomework_1

    Re库 1 学习链接 https zhuanlan zhihu com p 135862699 folium库 1 学习链接A https blog csdn net weixin 43903639 article details 1138
  • Fedora 网络配置

    运行 vim etc sysconfig network scripts ifcfg eth0 修改文件如下 具体IP地址及网关根据自己要求修改 DEVICE eth0 ONBOOT yes BOOTPROTO static IPADDR
  • Taro如何打包Android apk?

    首先 我们使用使用命令创建模板项目 创建的命令如下 taro init myApp 然后 使用 yarn 或者 npm install安装依赖包 并使用下面的命令编译Taro项目 yarn dev rn 启动后会开启一个监听的进程 不过 细
  • Blender学习笔记(基于辣椒酱教程)

    第一节课 安装与配置 主界面 1 推荐使用 zip版本 解压在纯英文路径 2 简体中文 3 如果想进一步翻译 使用 全局翻译 的翻译器 有下载 4 界面顶部标签英文改中文 双击命名 界面 建模 雕刻 UV编辑 纹理绘制 着色器 动画 渲染
  • 我的进程去哪儿了,谁杀了我的进程

    曾经在我眼前 却又消失不见 这是今天的第六遍 一段感情 我们希望它能够天长不久 越稳定越好 最怕的就是中途夭折 无疾而终 即使不能到海枯石烂的一天 我们也希望好聚好散 大家理智的告别 然后笑着活下去 况且 我们时候 我们只是希望给这段感情按
  • 2021-11-08 移位 曲线 转换 统计

    1 status 0xff 255 溢出 矩阵阀值 0xFF 分辨率 ecu信号扫描间隔 50ms 2 对应 参数判断 增加 状态 颗粒度扫描限制 方程代入参数说明 发动机负荷 engload 高负荷时长 两点间有限时长limT1 指定车速
  • 神经架构搜索在视频理解中研究进展的综述

    作者 Michael S Ryoo 研究员与 AJ Piergiovanni 学生研究员 Google 机器人团队 来源 TensorFlow ID TensorFlow official 视频理解一直是项颇具挑战性的难题 视频中包含时空数
  • linux软路由ospf,深入解析使用Linux+Zebra构建软路由系统

    Zebra的基本设置 Zebra无后台交互程序是实实在在的路由管理程序 它控制着其它的软件模块 同时还提供与客户交互的主端口 Zebra RPM套件中包括一个完整的参考设置文件 但是 我们只需要建立一个包括以下内容的 etc zebra z
  • C++开源程序库

    1 系统和网络编程库 ACE 除了ACE之外 还有很多系统和网络编程方面的程序库 比如在线程库方面 还有ZThread boost thread 如果放大到C C 领域 还有APR 还有CII 在文件和目录操作方面 boost也有相应的组件
  • HTML+CSS+JS学习(持续更新中)

    文章目录 HTML 1 文档声明 2 HTML5的基本结构 3 字符实体 4 meta标签 5 语义标签 5 1基础的几个 5 2HTML5新增的标签 6 行内元素和块元素 7 内容修正 8 布局标签 9 列表 10 超链接 10 1tar
  • Allegro如何查看走线的宽度

    1 设置想要显示的单位 mm或者mil 2 Find中勾选Cline segs 点击感叹号 双击走线 查看结果
  • Apache APISIX 2.13.0 发布

    距离 Apache APISIX 上一次发布 LTS 版本已经过去了大半年的时间 今天 Apache APISIX 社区带来了一个全新的 LTS 版本 2 13 0 该 LTS 版本不仅性能更加稳定 而且支持了更多的可观测性 服务发现插件和
  • (环境搭建四) ubunut安装gpu版本pytorch: (Ubuntu16.04 RTX2080ti: 安装NVIDIA驱动+cuda10.0+cudnn7.4)

    背景介绍 新机器2080ti的显卡 安装gpu版本pytorch 后来又装了一台2张3080ti的机器 本文参考 1 Ubuntu16 04 RTX2080 安装NVIDIA驱动 cuda10 0 cudnn7 3 1https blog
  • 【华为OD机试真题 JAVA】最大N个数与最小N个数的和

    JS版 华为OD机试真题 JS 最大N个数与最小N个数的和 标题 最大N个数与最小N个数的和 时间限制 1秒 内存限制 262144K 语言限制 不限 给定一个数组 编写一个函数来计算它的最大N个数与最小N个数的和 你需要对数组进行去重 说
  • 基于SD卡的FatFs文件系统(FatFs移植到STM32)

    平台 STM32ZET6 核心板 ST LINK V2 SD卡 USB串口线 一 移植 工程介绍 主要文件在USER组中 bsp sdio sdcard c bsp sdio sdcard h和main c 另外FatFs是用来后面移植文件
  • SpringBoot输出“Hello”

    1 创建SpringBoot 创建controller包 其绝对路径是C Dpan javaProject jProject src main java com example jproject controller 在controller
  • 给已经创建好的项目添加eslint

    今天拿到一个项目 发现没有安装eslint 现在就在这大概记录一下vue项目添加eslint的具体的过程 实现目标 给项目添加eslint 在这叫做demo 准备工作 找一个已经开启了eslint的项目 在这叫做demo1 没有的话 可以直
  • 数字图像处理学习笔记(一)

    文章目录 前言 第一章绪论 1 1 什么是数字图像处理 数字图像 数字图像处理 像素 图像处理的三种典型计算处理 1 2 数字图像处理起源 1 3 数字图像处理应用 1 4 数字图像处理基本内容 1 5 图像处理系统的组成 1 6 小结 第
  • 通俗易懂详解typedef函数指针

    1 函数指针 第一个问题 搞清楚函数指针 必须知道函数指针的实质是一个是一个指针 并不是函数 函数有自己的函数体 而指针只是一个变量 也就比如我们常声明的int a 0中的a一样 细致的讲 如果在程序中定义了一个函数 那么在编译时系统就会为