代码常识--函数指针


很早的时候课上见过函数指针,后来就再也没有遇到过。以后我会留心标准C++里是否还用这个东西。函数指针说起来是个指针变量,指向一个函数的入口地址。函数的入口地址是什么,暂且不去细究,总之和普通变量地址,结构体地址,类地址一样,有了这个地址,就有了这个地址指向的实体。

关于函数指针的几点常识:

1.函数指针的声明

函数类型 (*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,如果不加括号,代码就成了声明一个返回类型为指针类型的函数(指针函数),后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

2.函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,函数名和数组名都是地址常量(不可修改,不可赋值,只能做右值),因此在赋值时,直接将函数指针指向函数名就行了。

注意:赋值时要求函数指针和他指向函数的格式一致才可以赋值,即函数返回类型一致,参数列表一致。否则无法赋值。

另外,赋值语句的语法格式,和函数调用格式有点奇怪,如下面的代码:

 1 int print(int x)
 2 {
 3     cout<<x<<endl;
 4     return 0;
 5 }
 6 
 7 int _tmain(int argc, _TCHAR* argv[])
 8 {
 9     int a=10;
10 
11     int (* p)(int);    //声明两个函数指针
12     int (*p2)(int);    
13 
14     p=print;           //用两种形式赋值,貌似第二种不合法,但经验证却是成功的
15     p2=(*p);            //经验证这种方式是成功的,但是(*p2)=p是错的
16 
17     (*p)(a);           //用两种形式调用函数,貌似第二种不合法,但经验证却是成功的
18     p(a); 
19 
20     (*p2)(a); 
21     p2(a); 
22
23     getchar(); 
24     return 0; 
25 }

也就是说,p的值竟然和(*P)的值是一样的。有人认为,C语言中,本着指针的使用原理,函数指针使用时加*(dereference operator);C++中为跟函数对象统一,所以不加*。因此,语法上函数指针使用时加不加*都一样。

优质内容筛选与推荐>>
1、[洛谷P3372]【模板】线段树 1
2、Windows 系统System帐号及权限
3、BZOJ1562: [NOI2009]变换序列
4、C语言笔记本
5、C#(VS2008)服务编写-安装和部署


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号