C/C++系列——函数声明全解析

来源:互联网 发布:乳胶床垫 知乎 编辑:程序博客网 时间:2024/06/13 15:06

一. 函数是什么

函数,从代码层面(逻辑上)来讲,就是一个功能模块,集成了若干程序语句;从运行时(硬件物理上)来讲,就包括了一个内存代码块和一个内存堆栈。程序员所实现的每个程序系统中往往包含了大量的函数,各个函数之间存在着直接或者间接的调用关系。我们知道,要想调用一个函数,就需要知道一个函数的声明情况(包括,函数名,返回类型,参数列表等),从系统层面看,就需要知道函数的入口地址。给一个函数分配入口地址是由编译器来完成的,这一过程对于程序员来说是透明的。而程序员所接触到的就是仅仅是函数名。从这个角度看,函数名就是一个指针:我们可以通过对一个函数名进行解除引用从而指向对应的函数入口地址。


二. 理解函数声明

先弄清楚一个问题:函数指针 vs 指针函数?

函数指针:顾名思义,函数是“修饰”,指针是本质。函数指针就是一个指针,这个指针指向函数的地址。形如,void (*fp)(int),fp就是一个函数指针。

值得注意的是:调用fp所指向的函数,可以采用一般的指针解除引用的方法,形如,*fp(2)。或者采用直接调用函数的方法,形如,fp(2)。另外,对于函数的调用,不管是传统的函数名,还是函数指针,这两种调用方法都是可以的。

指针函数:类似地,指针是“修饰”,函数是本质。指针函数就是一个函数,其返回值类型是一个指针类型。形如,void *func(int),func就是一个指针函数。


然后我们再来看一个例子

例1.1

void (*signal(int, void(*)(int)))(int);
为了读懂上述函数声明,我们采用分块的方式来阅读。首先,将void (*signal(int, void(*)(int)))(int)中绿色部分用简单字符串func替换,于是,复杂的语句就变成了void (*func)(int)。这样我们就可以看出func就是一个函数指针,其返回值为void,参数列表为一个int类型:也说明了这实际上就是signal的返回类型。再进一步分析绿色部分的语句signal(int, void(*)(int)),signal的参数列表为一个int类型和一个函数指针(其返回类型为void,参数为一个int类型)。

例1.2
typedef void (*func)(int);func signal(int, func);
typedef的作用是声明一种类型,所以这个语句就产生了一种新的类型:一个名为func的,返回值为void,参数为一个int类型的函数指针。紧接着下一语句是函数signal的声明,其返回类型为func,参数为一个int类型和一个func类型。

综上,例1.1和例1.2的语义是相同的,只是利用了typedef的类型声明功能后,函数声明变得更加清楚易懂。他们的作用都是声明了一个名为signal,返回类型为一个(返回值为void,参数为int的)函数指针,参数为一个int类型和一个(返回值为void,参数为int的)函数指针。



0 0
原创粉丝点击