函数类型和函数指针类型

函数类型和函数指针类型用typedef定义两种类型typedef void (*func_p)(char *name); //定义函数指针类型typedef void

欢迎大家来到IT世界,在知识的湖畔探索吧!

用typedef定义两种类型

typedef void (*func_p)(char *name);	//定义函数指针类型
typedef void func_t(char *name);	//定义函数类型

欢迎大家来到IT世界,在知识的湖畔探索吧!

平时用的更多的是函数指针类型,比如作为函数参数传入回调函数等等。实际上函数类型也是可以作为函数的参数进行传递的。

函数指针和函数类型变量使用的不同:

欢迎大家来到IT世界,在知识的湖畔探索吧!/*定义一个函数指针类型,一个函数类型,参数一样*/
typedef void (*func_p)(char *name);	//定义函数指针类型
typedef void func_t(char *name);	//定义函数类型

/*定义参数匹配的函数*/
void func_callback(char *name)
{
    printf("hello,%s\n",name);
}

int main()
{
    func_p f1=func_callback;
    func_t *f2=func_callback;
    f1("aaa");
    f2("bbb");
}

执行结果:

hello,aaa
hello,bbb

从上面可以看出来函数指针类型和函数类型变量在使用上的区别。

  • func_p就是函数指针类型,所以定义的f1也就是一个函数指针,可以直接等于函数名称
  • func_t 是函数类型,所以它定义的变量要加上*,这样f2才是一个函数指针,才能把函数名称赋值给它

函数名称和&函数名称

上面f1=func_callback;是我们在程序里面大多数的写法。但是经过测试,f1=&func_callback;竟然也是可以的,最终函数执行结果也是一样的。

所以我又抱着怀疑的态度写下了如下的代码:

欢迎大家来到IT世界,在知识的湖畔探索吧!int main()
{
    func_p f1=func_callback;
    func_t *f2=func_callback;
    if(func_callback==&func_callback)
    {
        printf("============\n");
    }
    f1("aaa");
    f2("bbb");
}

执行结果为:

============
hello,aaa
hello,bbb

可以得出结论:函数名称=&函数名称。也就是函数名称比如func_callback本身是一个函数指针,前面加上一个&求地址符号后&func_callback 还是一个函数指针。

那对于调用函数的写法下面的也是等效的:

(*f1)("aaa");
(*f2)("bbb");

函数指针类型,函数类型作为参数
把一个回调函数传递进另外一个函数,通常都会通过函数指针参数的形式进行传递


typedef void (*func_p)(char *name);	//定义函数指针类型
typedef void func_t(char *name);	//定义函数类型

/*定义回调函数*/
void func_callback(char *name)
{
    printf("hello,%s\n",name);
}

/*定义函数,函数指针类型作为参数*/
void run_p(func_p fp,char *name)
{
    fp(name);
}

/*定义函数,函数类型作为参数*/
void run_t(func_t ft,char *name)
{
    ft(name);
}

int main()
{
    run_p(func_callback,"PP");
    run_t(func_callback,"TT");
}

运行结果为:

hello,PP
hello,TT

得到这样的运行结果估计要惊讶很多人,我没做这个实验之前也觉得应该编译的时候就会出问题。func_t 本身是函数的类型,而传递进行的func_callback又是一个函数指针,按正常来说这里会类型不一致。
这里可能编译器会帮忙做一些处理,所以也不去深究为什么了,不过还是要记住这种不寻常的易忽略的地方。
如果我们自己写代码,还是尽量使用函数指针作为参数进行传递。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/49893.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信