当前位置:文档之家› 复杂的函数指针例子分析.doc

复杂的函数指针例子分析.doc

复杂的函数指针例子分析2008-01-26 11:38:22
分类:
一个最简单的函数指针定义如下:
Void (*funcPtr) (); //funcptr是一个函数指针,它指向的函数没有参数,返回值为void 非常复杂的函数指针定义:
1.Void*(*(*fpl)(int))[10];
解析:Void * 这是一个有10个void*类型的元素的数组。

x=* ( * fpl)(int),从而可以看出(*fpl) (int)它是一个指
针,指向一个数组。

这个数组有10个void指针类型的元素。

Fpl是一个函数指针,它的参数是一个int型的参数。

返回值为一个指向含有1。

个void*元素的数组的指针。

2.Void*( *fpl)(int)[10];
解析:void*X[10];今X是一个有着[。

个void*类型的数组
x=( * fpl)(int);
Fpl是一个函数指针,它有一个整型参数,其返回值是一个有着1()个void* 类型的元素的数组。

若是这个形式Ve i d-*-—和•块40], 则状返物=-令指向含有个v&d 类型的数组的指针U
3.Void(*fpl)(int)[10];
解析:void X[10]->X是一个有着1()个void类型的数组
x=( * fpl)(int);
Fpl是一个函数指针,它有一个整型参数,其返回值是一个有着10个void 类型的元素的数组
若是这个形式,Void ( * fpl)(int)[10],则其返回值为一个有1()个void类型的数组。

4・Float (*(*fp2)(int,int,float))(int);
解析:Float X(int)今X是一个函数,有,个整型参数,返回值是一个浮点数。

x=*(*fp2)(int,int,float);
Fp2是一个函数指针,它有三个参数,前两个是整型,最后一个是浮点型。

其返回值是一个指针,是一个指向函数的指针(函数指针)o这个函数指针所指向的函数的原型是只有一个整型参数,返叫值是一个浮点数。

5.Typedef double (*(*(*fp3)())[10])();
解析:fp3是一个函数指针;它不带参数;返回值是一个指针。

x=(*(*fp3)())
Typedef double (*X[10])()
X是一个数组,他有1()个元素,它的元素都是函数指针,这个函数指针所
指向的幽数原型是一个没有参数,返回值为double类型的函数。

综合起来就是:fp3是一个新定义的数据类型,它是一个函数指针,这个函数指针所指向的函数原型是不带参数,返回值是一个指向数组的指针。


个数组有10个元素,其元素类型是一个函数指针,这个函数指针所指向的函数原型是一个没有参数,返回值为double类型的函数。

6.Int(*(*fp4())[10])();
解析:fp4是一个函数,他没有参数,返回值是一个指针;
X= (*fp4());
Int(*X[10])();
X是一个数组,其有1()个元素,每个元素都是一个函数指针,这个函数指针所代表的函数原型是一个没有参数,返回值是整型的函数。

综合起来就是:fp4是一个函数,他没有参数,返回值时一个指向数据的指针,这个数组有10个元素,每个元素都是一个函数指针,这个函数指针所代表的函数圆型是一个没有参数,返回值是整型的函数。

char* const* (*ss[23][200])(void (*)(int h, void (*)(void)))
void*(*(*fp1)(int))[10];
看了以后,我怀着“明知山有虎,偏向虎山行”的心理,决定写•下我|'|己关于复杂指针的理解方法。

我的这个方法是按照语法,•层一层进行分析来理解复杂指针的,完全是自己的方法,不- 定适合其他人,不过写出来也给大家一个参考。

首先拿简单-的那个例子来介绍,下我的“层次理解法”:(this name is made up by myself:P) void *(*(*fp1)(int))[1O];
⑴ 从外层看:void* (*(*fp1)(int)) [10];这个等价于:void* A[10];所以整
个声明就是个10个元素的数组,这个数组的每个元素是一个指向void的指针(或者说成:每个元素是一个void* );
(2)再往里看:(* (*fp1)(int) ) ==> * (*fp1) (int)这就是•个函数指针,所指向函数需要一个int型的参数,并且返同值是一个指针;下•步就是确定返PI值指针的类型了;⑶ 结合(1),就知道,fp1返同值指针指向的就是(1)里所声明的那个类型。

所以,整理-下语言,就是:fp1是•个函数指针,指向的函数有•个int型参数,并返同 -个指针;返Pl的这个指针指向的是•个含有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的指针;
⑵ •个•个来看,先看T, char* const是char型的指针常量;]
(3)再看A:(* ss[23][200] ) (B),这个相当于:(* F ) (B),也就是一个函数指针;
(3.1) A的里面ss[23][200]是•个二维数组声明,这个数组的类型是什么呢?结合⑶就知
道了:这个数组的每个元素就是(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);它指向的函数的返Pl值是•个指针,这个返同值指针的类型是char型的指针常量;函数(a)的参数只有一个,是个函数指针(b):(b)指向的函数返"I值是void型,参数有两个,第-个是int型变鬲,第二个乂是•个函数指针(c), (c)的返|可值是void,参数也是void。

相关主题