当前位置: 首页 > news >正文

函数指针变量和typedef关键字

目录

1.什么是函数指针变量

2.函数指针的使用

3.两个有趣又难懂的代码

4.typedef关键字


1.什么是函数指针变量

  • 整型指针:存放int变量地址
  • 数组指针:存放数组地址
  • 函数指针:存放函数地址

类比整形指针和数组指针,我们应该知道函数指针变量是一个存放函数地址的指针,通过这个地址我们可以间接的调用函数

2.函数指针的使用

语法格式:

指针指向函数的返回类型 (*函数指针的变量名)(指向函数的参数类型和个数的交代)

如:

int (*p)(int x,int y)

这是一个名字为p的指针 指向一个返回类型为int 参数为两个整型的函数

下面是通过函数指针调用函数的示例:

#include<stdio.h> int add(int a, int b) { int c = a + b; return c; } int main() { int (*p)(int x, int y)=add; int x = 10; int y = 30; printf("%d\n",(*p)(x, y)); printf("%d\n",p(x, y)); //这里在使用函数指针的时候(*p)(x,y)可以简写成p(x,y) return 0; }

输出结果:

3.两个有趣又难懂的代码

给大家看两段有趣的代码

(*(void(*)( ))0)( )

解释:

①这段代码其实是一次函数的调用,调用的是地址为0处的一个函数,这个函数没有参数,没有返回值

②0本身是一个整型变量,但是前面的(void(*)())将0强制类型转化成了函数指针类型,也就是说这个被当作了这个函数的地址

③最前面的*就是对0处地址的解引用,即对函数的调用

一句话:调用地址0处的函数

void(*signal(int,void(*)(int))) (int)

这段是一个函数声明,声明的函数名叫signal

先看最外面的void(*)(int)这是函数的返回类型,再看里面是函数的参数类型,一个是整形int,一个是函数指针void(*)(int)

  • 函数名:signal
  • 参数:int+ 函数指针void(*)(int)
  • 返回值:void(*)(int)函数指针类型

看完这两段代码是不是觉得特别的复杂,那么有什么办法解决呢?

4.typedef关键字

什么是typedef呢?

typedef是对类型进行重命名的关键字

比如:

你想给无符号整形类型int换一个名字,让它写起来更方便一点,可以这样写

typedef unsigned int uint

那么

unsigned int a;就可以写成 uint a;

对于指针类型也是同理

但是如果是数组指针和函数指针会稍有区别:

比如数组指针类型

对int(*p)[5]重命名为pa

typedef int(*pa)[5]

把(*)中的名字换成pa即可

函数指针类型也是同理:

对int (*p)(int,int)重命名为paa

typedef int (*paa)(int,int)

那么就可以用typedef关键字解决上面那两段代码复杂的问题了

void(*signal(int,void(*)(int))) (int)

将void(*)(int)进行重命名

typedef void(*p)(int);

那么代码就可以写成:

p signal(int,p);

这样看就简洁很多了

另外typedef含有一个方便的用法,比如:你想命名多个变量的时候

int* p1,p2;

这个时候的*只能给到p1,p2是用不到*号的,也就是p1是指针类型,而p2是整型类型

而使用typedef

typedef int * i*;

i* p1,p2;

这个时候是可以直接定义两个指针变量的

http://www.jsqmd.com/news/541479/

相关文章:

  • 英雄联盟辅助工具League-Toolkit全攻略:从入门到精通的智能选将与战绩分析指南
  • springboot框架-美妆化妆品商城进货系统
  • StarCCM+汽车热管理仿真:最佳实践探索
  • 计算机组成原理第一章:精选习题集
  • STM32 FPU性能优化与DSP应用实战
  • 热红外图像的局部粗糙度提取算法matlab仿真
  • 家庭应用实例:OpenClaw+nanobot打造智能家居控制中心
  • Java基础学习——API
  • 鼓风机气压检测系统 MCGS7.7 仿真程序探索
  • 2026CWFP哪家好路通管业深耕环保管道领域 - 优质品牌商家
  • 如何免费将CAJ文件转换为PDF?caj2pdf完整使用指南
  • matlab 永磁同步电机矢量控制 转速控制
  • Unreal Engine 4 Scripting System:模块化Mod开发工具完全指南(面向游戏开发者)
  • Satellite 2026 技术分享:安诺尼Aaronia两款高频测量设备解析
  • OpenClaw+GLM-4.7-Flash:个人项目进度跟踪系统
  • 【数据集】全国乡镇级行政边界数据分享(精确到镇级)
  • 嵌入式Linux系统开发与SOC芯片验证全解析
  • League-Toolkit智能优化:突破极地大乱斗英雄选择困境的全攻略
  • java打卡学习3:ArrayList扩容机制
  • AI辅助开发新体验:让快马AI帮你深度处理六花直装版本更新中的技术任务
  • 智能日历管理:OpenClaw+GLM-4.7-Flash自动安排会议
  • Qwerty Learner 数据持久化架构深度解析:IndexedDB 异步存储方案技术实现
  • Keil MDK-ARM工程配置与优化实践指南
  • TrafficMonitor插件完全指南:三步打造个性化系统监控中心
  • Arduino轻量级哈希表UnorderedMap实战指南
  • 树莓派C语言工程建立
  • 计算机毕业设计springboot羽毛球俱乐部管理系统设计与实现 基于SpringBoot的羽毛球运动场馆预约与会员服务平台开发 羽毛球爱好者社区与场地资源智能调度系统的设计与实现
  • LeetCode-031:下一个排列,从右往左找“转折点”,再反转后缀
  • debian 更新内核后,nvidia 驱动突然不见了,处理
  • 基于springboot的志愿者招募管理系统