您现在的位置是:网站首页 -> 代码相关 文章内容
C/C++中复杂的指针的理解方法-itarticl.cc-IT技术类文章记录&分享
发布时间: 5年前【代码相关】 128人已围观【返回】
C/C++中的指针是令所有 C/C++ programmer 都望而生畏的东西,有很多难点。其中,光是对复杂的指针定义就很难理解。今天看到www.jluopen.org论坛里面jcwkyl发了一篇关于《C++编程思想》里复杂的函数指针理解方法的帖子(http://www.jluopen.org/bbs/thread-137-1-1.html),里面有这样两个复杂的指针定义:
char* const* (*ss[23][200])(void (*)(int h, void (*)(void)))
void *(*(*fp1)(int))[10];
看了以后,我怀着“明知山有虎,偏向虎山行”的心理,决定写一下我自己关于复杂指针的理解方法。
我的这个方法是按照语法,一层一层进行分析来理解复杂指针的,完全是自己的方法,不一定适合其他人,不过写出来也给大家一个参考。
首先拿简单的那个例子来介绍一下我的“层次理解法”: ( this name is made up by myself )
void *(*(*fp1)(int))[10];
(1) 从外层看:void* (*(*fp1)(int)) [10]; 这个等价于: void* A [10]; 所以整个声明就是一个10个元素的数组,这个数组的每个元素是一个指向 void 的指针(或者说成:每个元素是一个 void*);
(2) 再往里看: (* (*fp1)(int) ) ==> * (*fp1) (int) 这就是一个函数指针,所指向函数需要一个int型的参数,并且返回值是一个指针;下一步就是确定返回值指针的类型了;
(3) 结合(1),就知道,fp1返回值指针指向的就是(1)里所声明的那个类型。
所以,整理一下语言,就是: fp1 是一个函数指针,指向的函数有一个int型参数,并返回一个指针;返回的这个指针指向的是一个含有10个元素的数组,这个数组的每个元素是一个void*.
现在看一下那个比较BT的例子:
char* const* (*ss[23][200])(void (*)(int h, void (*)(void)));
(1) 最外层: char* const * (*ss[23][200]) ( void (*) ( int h, void (*)(void) ) ); 这个相当于:T * (A) (B); 也就是一个函数指针,所指向的函数的参数是B,返回值是T的指针;
(2) 一个一个来看,先看T,char* const 是 char型的指针常量;
(3) 再看A:(* ss[23][200] ) (B),这个相当于: (* F ) (B),也就是一个函数指针;
(3.1) A的里面 ss[23][200] 是一个二维数组声明,这个数组的类型是什么呢?结合(3)就知道了:这个数组的每个元素就是(3)中分析得到的——函数指针;整理一下就是:ss[23][200]的每个元素都是一个函数指针;
(4) 再看B: ( void (*) ( int h, void(*)(void) ) ) 这个又是一个函数指针,相当于: void (*F) (P); 它指向的函数参数是P,返回值是void;
(4.1) B这个函数指针指向的函数需要2个参数:第一个参数是int型,第二个参数是:void (*)(void),即:第二个参数又是一个函数指针(这个指针很好分析,就不写了);
(5) 结合(3)和(4)就知道 (*ss[23][200]) (B) 这个数组函数指针所指向的函数的参数也是一个函数指针;
(6) 又结合 (2) 知道(5)的函数指针返回值类型。
所以,整理一下,得到:ss是一个23X200的二维数组,每个元素是一个函数指针(a);它 指向的函数的返回值是一个指针,这个返回值指针的类型是char型的指针常量;函数(a)的参数只有一个,是一个函数指针(b);(b)指向的函数返回值 是void型,参数有两个,第一个是 int 型变量,第二个又是一个函数指针(c),(c)的返回值是void,参数也是void。
发布时间: 5年前【代码相关】128人已围观【返回】【回到顶端】
很赞哦! (1)
相关文章
点击排行

站长推荐

猜你喜欢
站点信息
- 建站时间:2016-04-01
- 文章统计:728条
- 文章评论:82条
- QQ群二维码:扫描二维码,互相交流
