标签:
指针函数:
是指带指针的函数,本质上是一个函数,函数的返回类型是某一类型的指针。
1 int *fun(int a);
由于函数调用操作符()的优先于大于间接操作符*,首先执行的是函数调用操作,所以它是一个函数,只不过这个函数的返回值是一个地址值,函数的返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数的返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
1 float *fun(); 2 float *p; 3 p = fun(a);
函数指针:
指向函数的指针变量,即本质是一个指针变量。最常见的两个用途是转换表(jump table)和作为参数传递给另一个函数。
1 int (*fun)(int a); //声明一个函数指针
简单的声明一个函数的指针,并不意味着马上就能使用它,和其他指针一样,对函数指针执行间接访问之前必须把他初始为指向某个函数。
1 int f(int); 2 int (*pf)(int ) = &f;
其中第二个声明创建了函数指针pf,并把它初始化为指向函数f,函数初始化可以通过一条简单的赋值语句来实现。
初始化表达式中的&操作符是可选的,因为函数名使用时总是由编译器把它转换为函数指针,&操作符,只是显示地说明了编译器将隐式执行的任务。
被初始化的函数指针,有三中方式对起进行调佣:
1 int ans; 2 ans = f(25); 3 ans = (*pf)(25); 4 ans = pf(25);
第一条赋值语句是使用名字调用函数,执行的过程是,函数名f首先被转换为一个函数指针,该指针指向函数在内存中的位置,然后函数调用操作符调用该函数,执行开始于这个地址代码。
第二条语句是对pf执行间接访问操作,他把函数指针转换为一个函数名,这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把他转换过去,效果和第一条语句一样。
第三条语句是间接访问操作并非必需,因为编译器需要的是一个函数指针,当然效果和前面两个一样。
标签:
原文地址:http://www.cnblogs.com/running-ftd/p/4881083.html