编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

初识 typedef void(*Func)(void)(初识你名久居我心啥意思)

gowuye 2024-04-25 04:43 10 浏览 0 评论


void (*Fun)(void);
假如就只是写上这样的一句代码,显然这就是定义了一个变量Fun,这个Fun变量是一个指针,指向返回值和参数都是空的函数的指针。而typedef void(*Func)(void) 是函数指针的类型定义,代表了一种新的类型。作用是声明一个 void(*)()类型的函数指针Func。这些基础知识我们一步一步来学习了解一下。

typedef/define的基本概念

typedef

现有类型创建一个新的名字,基本用法举例:

typedef unsigned char UCHAR;//右边代替左边

typedef能隐藏笨拙的语法构造以及平台一些相关的数据类型,可以使得代码更美观,可维护性、可移植性、可读性更强,来举个例子吧。

//定义一个函数
void tech(void) { printf("tech dreamer"); }
void main()
{
    //定义一个指针,指针的名字叫func
    void (*func)();//tech函数带参数的话也可以
    func = &tech; //&可以不加
    func();        //第一种调用方式,带参数也可以
    (*func)();     //第二种调用方式,带参数也可以
}

为了写出更加美观和可读性强的代码,我们经常使用typedef来定义一个类型,代码如下。

void tech(void) { printf("tech dreamer"); }
//命名一个类型,那么这个时候func不可以直接调用,而是一个类型了
typedef void (*func)();
void main()
{
    //定义一个可调用的指针变量(函数):myfunc
    func myfunc;
    myfunc = &tech; //&可以不加
    myfunc();         //第一种调用方式,带参数也可以
    (*myfunc)();      //第二种调用方式,带参数也可以
}

与define的区别

typedef 是在编译过程中被解析的,而#define是在编译之前的预处理时被破解的;#define只是对所定义的别名的简单替换,而typedef可以做到#define能做到的所有事情,而且可以做得更好

函数指针的基本概念

我们先了解一下函数指针的基本概念,函数指针是指向函数的指针变量,他的本质是一个指针变量,函数的指针定义:int (*f)(int);

//举个例子声明一个函数指针
int (*f)(int x);
f=func; /* 将func函数的首地址赋给指针f */

与指针函数的区别

指针函数是返回值是某一类型指针的函数,即本质是一个函数,指针函数定义:int *fun(int x);,举个例子如下

float *fun();  
float *p;  
p = fun(a);  

这个函数的返回值是一个地址值,赋值给用同类型的指针变量p,也就是说,指针函数一定有函数返回值,而且在主调函数中,函数返回值必须赋给同类型的指针变量。

两者主要的区别是一个是指针变量,一个是函数。

typedef void(*Func)(void)为什么能这么用?

可能我们有这样的疑问,typedef一般的用法不是取个新名字吗?如果仿照变量类型声明,应该是这样typedef void(*)() variable;才比较眼熟易懂。

说一说我的理解,我们知道C语言的函数在被调用的时候是执行了一条转移指令,这条指令包含要转移到的地方的数据,同理,变量代表了一个地址,当你引用一个变量的时候,计算机会把这个地址的数据拿出来参与运算。

那么函数名也是一样,函数名代表的是一段代码的入口地址,引用了这个函数,那么计算机会使用转移指令转移到函数名代表的地址

所以typedef void(*Func)(void)相当于定义了一种类型,这个类型具有下面的特征:他是一个函数,没有返回值,没有参数。

因为处理器在进行上下文切换或者转移的时候要进行现场保护,不同的函数对现场保护的内容可能不一样,传入的参数使用的栈也不一样,相同类型的函数保证了现场保护的内容是一样的,参数的形式也是一样的。所以这样使用可以像用指针引用数据一样使用函数。

typedef void(*Func)(void)的应用

用法的好处,定义一个函数指针类型。

例子:

上面说到typedef void(*Func)(void)可以使得代码更可移植性、可读性更强,我们举个例子,有三个类型相似或功能相似的函数:

//构造3个通用函数
void TEST1(void) { printf("test1\n"); }//函数定义  
void TEST2(void) { printf("test2\n"); }//函数定义  
void TEST3(void) { printf("test3\n"); }//函数定义  
... ...  
//声明  
typdef void (*func)(void);

再来定义一个调用的函数

void test(int i)  
{  
  func vTask[3] = {&TEST1, &TEST2, &TEST3};  
  func fun = vTask[i];  
  (*fun)();  
}  

在main函数中,分别调用这几个不同输入参数的函数

void main()
{
  test(0);
  test(1);
  test(2);
 return 0;
}

这样的话代码就看着很舒服了。

相关推荐

R语言数据挖掘实践——支持向量机的常用函数
R语言数据挖掘实践——支持向量机的常用函数

e1071包是R语言中用于支持向量机建模与分析的软件包,其主要用于支持向量机的模型构建,提供核心函数svm()来建立支持向量机的基础模型,并且可辅助使用pred...

2024-05-18 12:15 gowuye

R数据分析:如何做聚类分析,实操解析
R数据分析:如何做聚类分析,实操解析

Clusteringisabroadsetoftechniquesforfindingsubgroupsofobservationswi...

2024-05-18 12:14 gowuye

用R语言做数据分析——马赛克图
用R语言做数据分析——马赛克图

到目前为止,我们已经学习了许多可视化定量或连续型变量间关系的方法。但如果变量是类别型的呢?若只观察单个类别型变量,可以使用柱状图或者饼图;若存在两个类别型变量,...

2024-05-18 12:14 gowuye

用R语言做数据分析——方差分析基本概论
用R语言做数据分析——方差分析基本概论

在实际工作中,影响一件事的因素是很多的,我们总是希望通过各种试验来观察各种因素对试验结果的影响。例如,不同的生产厂家、不同的原材料、不同的操作规程,以及不同的技...

2024-05-18 12:14 gowuye

R语言数据分析实战:数据清洗与可视化
R语言数据分析实战:数据清洗与可视化

《R语言数据分析实战:数据清洗与可视化》是一本深入浅出的实践指南,专为对数据分析感兴趣的读者精心编撰。本书旨在帮助读者掌握R语言这一强大的统计分析工具,通过实例...

2024-05-18 12:13 gowuye

用R语言做数据分析——双因素方差分析
用R语言做数据分析——双因素方差分析

在双因素方差分析中,受试者被分配到两因子的交叉类别组中。以基础安装中的Tooth-Growth数据集为例,随机分配60只豚鼠,分别采用两种喂食方法(橙汁或维生素...

2024-05-18 12:13 gowuye

用R语言做数据分析——独立两样本和K样本检验
用R语言做数据分析——独立两样本和K样本检验

coin包简介对于独立性问题,coin包提供了一个进行置换检验的一般性框架,通过这个包,我们可以回答如下问题:响应值与组的分配独立吗?两个数值变量独立吗?两个类...

2024-05-18 12:13 gowuye

用R语言做数据分析——用回归做方差分析
用R语言做数据分析——用回归做方差分析

之前提到方差分析和回归都是广义线性模型的特例,之前文章的所有设计都可以用lm()函数来分析。为了更好地理解输出结果,需要弄明白在拟合模型时,R语言是如何处理类别...

2024-05-18 12:13 gowuye

数据分析R语言——数据结构
数据分析R语言——数据结构

数据分析R语言——数据结构数组数组(array)与矩阵类似,但是维度可以大于2.数组通过array()函数创建。形式如;myarray<-array(v...

2024-05-18 12:13 gowuye

R语言数据挖掘实践——关联分析的常用函数
R语言数据挖掘实践——关联分析的常用函数

arules和arulesViz是R语言中两个专用于关联分析的软件包。其中arules用于关联规则的数字化生成,提供Apriori和Eclat这两种快速挖掘频繁...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——判别分析的常用函数
R语言数据挖掘实践——判别分析的常用函数

判别算法在R语言中实现主要涉及4个软件包中的相关函数,它们依次为MASS、klaR、class和kknn。其中MASS包含有大量实用而先进的统计计数函数及适用数...

2024-05-18 12:12 gowuye

用R语言读取Excel、PDF和JSON文件,终于有人讲明白了
用R语言读取Excel、PDF和JSON文件,终于有人讲明白了

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——聚类分析的常用函数
R语言数据挖掘实践——聚类分析的常用函数

使用R语言可以轻松实现聚类分析,stats、cluster、fpc和mclust是常用的四个聚类分析软件包。stats主要包含一些基本的统计函数,如用于统计计算...

2024-05-18 12:12 gowuye

用R语言做数据分析——时间序列分类
用R语言做数据分析——时间序列分类

时间序列分类是根据已标注的时间序列建立一个分类模型,然后使用分类模型预测未标记时间序列的类别。从时间序列中抽取出新特征肯呢个有助于提高分类模型的性能。特征提取技...

2024-05-18 12:11 gowuye

一文看懂用R语言读取Excel、PDF和JSON文件(附代码)
一文看懂用R语言读取Excel、PDF和JSON文件(附代码)

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:11 gowuye

取消回复欢迎 发表评论: