Freedom
C++ OpenGL English
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
指针函数&函数指针
#include
<
iostream
>
#include
<
string
>
using
namespace
std;
void
alert(
string
msg )
{
cout
<<
msg
<<
endl;
}
void
(
*
GetFunction())(
string
)
{
return
alert;
}
int
main()
{
//
刚看完C++ Primer第七章,合上书,写个复杂点的函数试一下,刚开始函数声明不是这样的,一点点往上加后来才变成了void (*((*ptr)()))(string)。
//
写完后就有种预感——明天看了估计就看不懂了,赶紧记下来,呵呵。
//
正在从C#转C++,这是在园子C++版里的第一篇文章,有错的地方请大家不要给面子,该拍砖拍砖;-)
//
ptr是一个指针,他指向一个函数,这个函数返回一个指针,该指针指向一个函数,这个函数带有一个string参数,但是没有返回值
void
(
*
((
*
ptr)()))(
string
)
=
GetFunction;
//
写完了声明然后调用,刚开始我写的是(*ptr)()("Hello C++"),一运行结果出来了,挺开心,可是在重读一遍的时候发现自己写“错”了,忘了解引用
可是结果怎么是对的?
//
接着又写了(*((*ptr)()))("Hi C++"),F5,结果也出来了
于是刚从函数声明中解脱出来的大脑又晕了
(
*
ptr)()(
"
Hello C++
"
);
(
*
((
*
ptr)()))(
"
Hi C++
"
);
//
为什么呢,难道函数指针在调用时解不解引用都可以吗?为了证明这个结论,再声明一个的函数指针试一下
void
(
*
ptrAlert)(
string
);
ptrAlert
=
alert;
//
不解引用
ptrAlert(
"
Hello Alert
"
);
//
解引用
(
*
ptrAlert)(
"
Hi Alert
"
);
/*
结论:函数指针在调用时解不解引用都可以
在网上搜到的相关资料:
围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,
那么必须加上*声明符。但C89不再把圆括号的左边限定为“函数”类型,而是一个后缀表达式。那么问题就来了,如果p的值是函数地址,那么*号就是声明符,
但如果p指向的内容是函数地址,*号就得被看作运算符了。同一种形式会有两种解释,这是一个矛盾。不仅函数调用如此,指向数组的指针也存在这种矛盾。
编译器为了处理这种情况得增加代码,效率自然就降低了。争论的最后结果是谁也不能把对方完全说服,于是就干脆两种都支持了。
说实话,我没怎么看懂上面的话,因为不了解C89这些标准,只是觉得(*p)()容易理解些,虽然写着麻烦点,以后c++程序写多了应该会有更深的认识吧。
*/
}
发表于 2008-08-06 16:20
Freedom
阅读(412)
评论(3)
编辑
收藏
引用
评论
#
re: 指针函数&函数指针
为什么要从C#转C++啊?
C#也不错么!
#
re: 指针函数&函数指针
发表下自己的看法吧。。。
void (*((*ptr)()))(string);
写成void ( *(*ptr)() )(string);
也可以的,本来operator()就优先于operator*,我个人不太喜欢过多的小括号,去掉括号反而觉得简洁,就像*it++对吧。
关于调用,感觉是不解引用的形式好,因为还有函数类,格式通用的话,使用模板的时候会很方便。
二义性也不是那么可怕,这个也是Coding下来总结出来的结果,人对代码的感觉是神奇的,不能和区区一些编译时间相提并论。
#
re: 指针函数&函数指针
@spirit
总觉得C#很不自由,可能是因为我的兴趣从web开发转移到图形和浏览器插件上了吧。其实也不是“转”,就是想多熟悉一个语言,我现在还得靠C#吃饭呢,呵呵。
@Alleluja
嗯,谢谢。可能以后c++代码写多了就有你这种感觉了,不过以我现在的程度不写一堆括号估计一转眼自己都看不懂了 ;-)
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
随笔:1 文章:0 评论:3 引用:0
<
2008年8月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
公告
什么时候才有资格在这儿发布第一篇opengl in C++文章?!努力呀!!!
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔档案
2008年8月 (1)
C++
CodeGuru
Cplusplus
CG
OpenGL
OpenGL API Docs
搜索
最新评论
1. re: 指针函数&函数指针
评论内容较长,点击标题查看
--Freedom
2. re: 指针函数&函数指针
评论内容较长,点击标题查看
--Alleluja
3. re: 指针函数&函数指针
为什么要从C#转C++啊?
C#也不错么!
--spirit