在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是:
Status (*compare)(Elemtype e,Elemtype temp);
这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别。
一、写法上的区别
函数指针变量 | 指针型函数 |
int (*function)(int i); | int *function(int i){} |
上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两者的一般形式:
函数指针变量:
类型类型说明符 (*指针变量名)(形参表);
指针型函数:
类型说明符 *函数名(形参表){
}
二、概念上区别
- 函数指针变量:指向函数入口的指针变量(本质是变量)
在随笔的开头,LocateElem函数的形参中就有一个函数指针变量,在函数的调用过程中,只要将真正要使用的函数名作为实参传递,就可以调用改函数。为什么会这样 呢?因为函数在使用时,函数的名称就像数组名一样表示了一个地址,名称指向了函数的入口地址。通过将函数名赋值给一个函数指针变量,这个函数指针变量就指向了一个 特定函数;类似于定义一个变量,将数组的首地址赋值给该变量,就可以通过该指针处理这个数组。
- 指针型函数:返回值为指针类型的函数(本质是函数)
既然只指针型函数的本质是一个函数,则它一定具有相应的函数体。而这个函数与一般函数的区别就是他的返回值是一个指针类型,这里有点迷惑人的地方是:
函数头上已经写了返回值的类型说明符是int(见一中的例子),为什么又说返回值是一个指针类型呢?这个理解是有些偏差的。
首先要清楚的是,定义一个指针变量,是得要确定指针指向的变量类型的。比如说:int *p;
上个语句执行后,会产生一个指针p,他指向一个整数类型。以此类推,在指针型函数中,类型说明符是对指针变量的一个说明,在int *function(int i){}这个例子中,指针型 函数的意义是函数返回一个指向整数类型指针变量。
三、结语
在分辨这两个概念时,只要时刻谨记他们的本质就可以:函数指针变量本质是变量,那么对于变量的一切操作,它都兼容;指针型函数是一个函数,只是说函数的返回值比较特殊,是一个指向类型说明符的指针变量。