C++ 函数指针探幽

C++ 函数指针探幽

学习C++ 函数指针过程中的一些疑问的产生和解答的记录,以下面四个方面展开;

  1. 如何获取函数的地址
  2. 如何正确声明函数指针
  3. 如何通过指针来调用函数
  4. 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类型不能出现在顶级数组类型中

这篇文章到此结束,期待更多交流的机会!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值