C/C++ 函数指针
2016-04-21 12:27
429 查看
函数声明
例如:float func(int, int);
以上就是一个函数的声明,要注意它的实际功能并没有被实现,换句话说就是它并没有被定义,只是声明此函数的存在。要想调用次函数,你必须对对此函数进行定义。例如,可以定义如下:
float func(int a, int b){ return (float)(a+b); }
float func(int,int);在计算机语言里被叫做表达式,此表达式说明
func(int,int)返回的是一个
float的数,
func是函数地址(特别注意,他不是指针,而是函数在内存中的地址),它可以接受两个
int型的数据作为传入参数。
函数指针
下面就是一个函数指针:float (*pf)(int,int);
这里pf就是一个函数指针变量,他可以接受的参数是两个
int,返回值为
float。所以这个函数指针变量可以存放返回值为
float,并且接受两个
int为传入参数的函数地址。
我们可以做如下赋值运算:
pf = func;
调用func函数也就可以写成pf(…).
实验
实验代码如下:#include <stdio.h> #include <inttypes.h> float func(int, int); int main(int argc, char** argv){ float (*pf)(int, int); pf = func; printf("%f\n", pf(1, 2)); printf("%.16X\n", (uint64_t)(pf)); printf("%.16X\n", (uint64_t)(func)); printf("%.16X\n", (uint64_t)(&func)); printf("%.16X\n", (uint64_t)(&pf)); return 0; } float func(int a, int b){ return (float)(a + b); }
其中一次执行结果如下:
3.000000 0000000025051005 0000000025051005 0000000025051005 000000004547FD08
注意输出结果的第二行,第三行以及第四行是相同的;最后一行与这三行是不同的。这说明:
bf这个变量存放的内容是
func的内容。
func本身就是地址,所以取地址符号并没有对输出值产生影响。
bf本身是个存放地址的变量,他自己也有地址,他的地址就是输出结果的最后一行。