Typedef 除了类似#define 宏定义;取别名;还有就是构造、声明/定义一个新型变量
定义一个函数指针类型:Typedef
void
(*name)(
void
)
,使用对象:
功能不同,但返回类型和参数类型一样的函数
void
:是函数返回类型
*name:函数指针
void
:是参数类型
优点:是把一类函数进行封装,调用灵活
缺点:不能快速定位函数位置,即不能go to definition of…
使用方法:
要先声明定义函数,否则会因找不到函数报错
void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);
void fun5(void);
----------------------------------------------------------------------
方法1:这个实际不用,不方便
name a=fun1;
name b=fun2;
调用方式:
----------------------------------------------------------------------
name tabl[N]={fun1,fun2,
…
};
调用方式
:
table[0]();
table[1]();
N值是根据实际设计功能而提前定义的编号,一般是#define实现,取名能够明确对应的函数是什么功能
----------------------------------------------------------------------
方法3:这个一般是函数种类很多
typedef struct
name a;
name b;
//共有M个成员
}Fun_InitTypeDef;
Fun_InitTypeDef Table[
N
]={fun1,fun2,
…
};
结构体和数组 组合之后可指向M*N个函数,每个数组元素可指向M个函数
调用方式:
Table[0].a();
Table[0].b();
Table[1].a();
Table[1].b();
N值是根据实际设计功能而提前定义的编号,一般是#define实现,取名能够明确对应的函数是什么功能
结构体中的成员也是要实现的功能,只不过这个功能更具体,相当于子功能
举例:N=1时是要实现排序功能,而结构体中a是从小达大排序
----------------------------------------------------------------------
#include "stdio.h"
void add1(void);
void dec1(void);
void mux1(void);
void add2(void);
void dec2(void);
void mux2(void);
void add3(void);
void dec3(void);
void mux3(void);
typedef void (*VentCtrlFunc)(void);//按照4Byte来的 构造函数指针类型 参数void型,返回void
//适用于功能不同,但参数和返回类型相同的函数
//定义结构体
typedef struct
{
VentCtrlFunc a;//定义一个函数指针
VentCtrlFunc b;
VentCtrlFunc c;
}Data_InitTypedef;
Data_InitTypedef Data_Initstre;
//使用结构体定义数组:结构体数组可指向N*3个成员变量,即可指向相同数量的函数
#define N 9
Data_InitTypedef Tabl[N]={add1,dec1,mux1,
add2,dec2,mux2,
add3,dec3,mux3};
void main(void)
{
if(0!=Tabl[0].a)
{
// Tabl[0].a();
Tabl[1].a();//函数调用
}
while(1);
}
void add1(void)
{
printf("add1\r\n");
}
void dec1(void)
{
printf("dec1\r\n");
}
void mux1(void)
{
printf("mux1\r\n");
}
void add2(void)
{
printf("add2\r\n");
}
void dec2(void)
{
printf("dec2\r\n");
}
void mux2(void)
{
printf("mux2\r\n");
}
void add3(void)
{
printf("add3\r\n");
}
void dec3(void)
{
printf("dec3\r\n");
}
void mux3(void)
{
printf("mux3\r\n");
}
void funt(void)
{
printf("funt\r\n");
}
Typedef 除了类似#define 宏定义;取别名;还有就是构造、声明/定义一个新型变量定义一个函数指针类型:Typedef void (*name)(void),使用对象:功能不同,但返回类型和参数类型一样的函数void:是函数返回类型*name:函数指针void:是参数类型优点:是把一类函数进行封装,调用灵活缺点:不能快速定位函数位置,即不能go to definition of…使用方法:要先声明定义函数,否则会因找不到函数报错void fun1(void);
篇一、
函数指针
函数指针
:是指向函数的
指针
变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的
函数指针
便指向这个地址。
函数指针
的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。
函数指针
的声明方法:数据
类型
标志符 (
指针
变量名) (形参列表);一般函数的声明为: int
func
( int x );而一个
函数指针
的声明方法为:int (*
func
) (int x);前面的那个(*
func
)中括号是必要的,这会告诉编译器我们声明的是
函数指针
而不是声明一个具有返回型为
指针
的函数,后面的形参要视这个
函数指针
所指向的函数形参而定。然而这样声明我们有时觉得非常繁琐,于是typed
2、
函数指针
的基本概念
3、
typedef
void
(*
Func
)(
void
)的由来
4、
typedef
void
(*
Func
)(
void
)的用途
题外话:跟
typedef
有个很类似的关键字时#define,两者其实是有区别的,这里就不详细说,只做简单阐述
typedef
语句是在编译过程中被解析
上面介绍得是我们常用的比较简单的
typedef
的用法,下面首先介绍一下
函数指针
。//定义一个
指针
变量p,根据形式1
函数指针
的形式
//我们可以知道他是指向一个参数为Int,返回
类型
为
//char的
函数指针
char (*p) (int)
函数指针
的形式:
形式1:返回
类型
(*函数名)(参数表)
引用链接: https://blog.csdn.net/Fantanstical/article/details/85223600.
typedef
void
(*
Func
)(
void
)的理解
typedef
和 #define 很类似。区别是:
typedef
是在编译过程中被解析的,而 #define 是在编译之前的预处理时被破解的; #define 只是对所定义的别名的简单替换,而
typedef
则要灵活的多。总的来说
typedef
可以做到 #define 能做到的所有事情,而且可以做得更好。
//定义一个
函数指针
pFUN,它指向一个返回
类型
为char,有一个整型的参数的函数
char (*pFun)(int);
//定义一个返回
类型
为char,参数为int的函数
//从
指针
层面上理解该函数,即函数的函数名实际上是一个
指针
,
//该
指针
指向函数在内存中的首地址
char glFun(int a)
typedef
void
(*p0)(
void
); //
使用
时要定义一个变量p0 p;
/*******************************************************************/
int (*p1)(int c,in
函数指针
是通过指向函数的
指针
间接调用函数。
函数指针
可以实现对参数
类型
、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this
指针
,因此,类的成员函数的
指针
和一般函数的
指针
的表现形式不一样。
1、指向一般函数的
指针
函数指针
的声明中就包括了函数的参数
类型
、顺序和返回值,只能把相匹配的函数地址赋值给
函数指针
。为了封装同
类型
的函数,可以把
函数指针
作为通用接口函数的参数,并通过
函数指针
来间接调用所封装的函数。下面是一个指向函数的
指针
使用
的例子。
代码
如下:#include /*指向函数的
指针
*/
typedef
int (*pFun
函数指针
是指向函数的
指针
变量。
通常我们说的
指针
变量是指向一个整型变、字符型或数组等变量,而
函数指针
是指向函数。
函数指针
可以像一般函数一样,用于调用函数、传递参数。
函数指针
变量的声明:
typedef
int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的
函数指针
变量
以下实例声明了
函数指针
变量 p,指向函数 max:
#include <stdio>
int max(int x, int y){
return x > y ? x : y;
int main(
void
){
/* p 是
函数指针
*/
int (* p)(int,
对于
typedef
void
(*T)(
void
*),我们进行一层层的剖析
首先写成
void
(*T)() 可以看出 T是一个
指针
,是一个指向返回值为
void
,参数为空的
类型
的
函数指针
在加上(
void
*) 为
void
(*T)(
void
*) 就变成了一个指向 返回值为
void
,参数为
void
*
类型
的
指针
在加上上
typedef
,加上后,T就不再是一个
函数指针
了,它代表着一种类...
typedef
用来声明一个别名,
typedef
后面的语法,是一个声明。本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数。罪魁祸首又是那些害人的教材。在这些教材中介绍
typedef
的时候通常会写出如下形式:
typedef
int PARA;
这种形式跟#define int PARA几乎一样,如前面几章所述,这些教材的宗旨是由浅入深,但实际做出来的行为却是以偏盖全。的确,这种形式在所有形式中是最简单的,但却没有对
typedef
进一步解释,使得不少人用...
typedef
void
* (*
func
)()是一种
函数指针
类型
的定义,它可以用于声明
函数指针
变量。定义一个
func
类型
的
函数指针
变量,可以
使用
以下语法:
func
my
Func
; // 声明一个名为my
Func
的
函数指针
变量
定义
函数指针
变量后,需要对它进行赋值,指向一个具体的函数。例如,假设我们有如下的一个函数:
void
* my
Func
tion() {
// do something
我们可以将它赋值给
函数指针
变量my
Func
:
my
Func
= &my
Func
tion;
或者更简洁的写法:
my
Func
= my
Func
tion;
然后,可以通过调用该
函数指针
来执行my
Func
tion函数:
void
* result = my
Func
();
上述
代码
会调用my
Func
tion函数并取得其返回结果。需要注意的是,因为
函数指针
变量的函数原型是
void
* (*
func
)(),因此被调用的函数也必须符合这个原型,即返回
类型
为
void
*,不带参数。如果被调用的函数具有不同的原型,则会导致编译错误或者运行时错误。