C++ 函数指针探幽
学习C++ 函数指针过程中的一些疑问的产生和解答的记录,以下面四个方面展开;
- 如何获取函数的地址
- 如何正确声明函数指针
- 如何通过指针来调用函数
- auto ,typedef与函数指针的使用
如下为具体内容:
//示例代码如下
#include<iostream>
using namespace std;
int think(){
cout << "hello function pointer "<<endl;
return 1;
}
void process(int(*pf)()) {
pf();
};
void process(int pf) {
cout << pf << endl;
};
int main(){
process(think);
process(think());
system("pause");
return 0;
}
方面1:获取函数地址:
process(think);//将think地址传进函数
process(think());//会执行think()函数,将返回值传给函数
hello function pointer
hello function pointer
1
请按任意键继续. . .
上述程序运行结果如上:
process(think);//将think地址传进函数
这串代码执行会经历两步过程:
step1:传入该参数类型的process
void process(int(*pf)()) {
pf();
};
step2:像think();调用一样该函数被执行
结论:只要使用函数名(后面不跟参数)即可获取该函数的地址。
方面2:如何正确声明函数指针
double pf(int);//普通声明
double (*pm)(int);//函数指针方式声明
double *pmm(int);//声明了一个double *返回类型的函数
如上两种方式声明函数指针,注意第三行代码意义;
!!!(第二第三行代码意义不同涉及到优先级问题,不过很容易想象到 double * pmm 不可能表示两种意义,用括号区别开来表示不同意义)
方面3:如何通过指针来调用函数
double pan(int x) {
cout << " hello pan" <<x <<endl; return 1.2;
};
double (*pann)(int x);
void pannn(double(*pf)(int), int x) {
pf(x);
};
int main() {
pann = pan;
(*pann)(1);
pann(2);
pannn(pann,3);
system("pause");
return 0;
}
hello pan1
hello pan2
hello pan3
请按任意键继续. . .
如上例子首先建立了一个pan函数,然后是函数同样返回值和参数类型的指针pann(!!再次提醒注意括
号的使用),最后是一个以同样类型的函数指针为参数的函数pannn;演示了如何使用函数指针去对应函数,以及如何将函数指针作为参数使用;
注意:!!函数指针有着数组那样类似的特点( 在c++ (*pann)(1); 与 pann(1);同样效果 ,等价 )
方面4:auto ,typedef与函数指针的使用
const double *(f1)(const double*, int);
const double *(*pan1)(const double*, int);
typedef const double *(*f2)(const double*, int);
int main() {
pan1 = f1;
auto pan2 = f1;
f2 pan3 = f1;
return 0;
}
这个例子介绍了简化函数指针的方法;思考并解决下面问题,你将对auto的使用有更多的经验;
请尝试定义一个函数指针数组,它包含三个索引,且都对应f1函数,应该在哪里加上[3]呢,能直接auto嘛?
答案:
const double *(*pan4[3])(const double*, int) = {f1,f1,f1};
//auto pan5[3] = { f1,f1,f1 };//auto类型不能出现在顶级数组类型中
这篇文章到此结束,期待更多交流的机会!