C/C++ 函数指针
扫描二维码
随时随地手机看文章
函数声明
例如:
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#includefloat func(int, int); int main(int argc, char** argv){ float (*pf)(int, int); pf = func; printf("%fn", pf(1, 2)); printf("%.16Xn", (uint64_t)(pf)); printf("%.16Xn", (uint64_t)(func)); printf("%.16Xn", (uint64_t)(&func)); printf("%.16Xn", (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
本身是个存放地址的变量,他自己也有地址,他的地址就是输出结果的最后一行。