QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1759|回复: 16

int *(*(*arr[5])())();的声明问题

[复制链接]
发表于 2004-8-31 10:52:15 | 显示全部楼层 |阅读模式
int *(*(*arr[5])())();的声明非常复杂。我的理解是这样的:arr是一个指针数组(由五个过元素组成)的指针型函数的指针型函数(返回值是int*)。不知对不对。请各位看看,分析分析,顺便讲讲分析方法。谢谢。
发表于 2004-8-31 11:22:57 | 显示全部楼层

我很想知道这个数组有什么用途……
回复

使用道具 举报

发表于 2004-8-31 13:27:50 | 显示全部楼层
[quote:e662f3494d="sjinny"]
我很想知道这个数组有什么用途……[/quote]考人   
回复

使用道具 举报

发表于 2004-8-31 17:24:55 | 显示全部楼层
[code:1]
#include <conio.h>
#include <typeinfo>
#include <cassert>

int* (*(*arr1[5])())();

typedef int*(*FUNC_PTR_1)();
typedef FUNC_PTR_1(*FUNC_PTR_2)();
typedef FUNC_PTR_2 FINAL_TYPE[5];

FINAL_TYPE arr2;


int _tmain(int argc, _TCHAR* argv[])
{
        using namespace std;

        assert(typeid(arr1)==typeid(arr2));

        cout<<typeid(arr1).name()<<endl;
        cout<<typeid(arr2).name()<<endl;

        getch();
        return 0;
}

[/code:1]

代码能说话,不用我多说。
看懂了以后就知道这东西显然是有用的,我也懒得举例子。
为了这种基础问题我还特地在这里注册了一个帐号,也不知道我是哪根筋搭错了。[/code]
回复

使用道具 举报

发表于 2004-8-31 20:02:27 | 显示全部楼层
挑衅??
回复

使用道具 举报

发表于 2004-8-31 20:18:33 | 显示全部楼层
楼上的楼上别生气,我们大家想到什么就说什么。楼上的老版主(我的前辈---虽然比我小很多)也别生气,楼上的楼上能认真回答问题值得我们学习---希望楼上的楼上常来。楼上的也不要忘在去水园灌水的同时回来帮这个版一把。         
回复

使用道具 举报

发表于 2004-8-31 20:23:15 | 显示全部楼层
恩……主要是目前我有项目在身,所以没法多来帮忙……
回复

使用道具 举报

发表于 2004-8-31 20:23:28 | 显示全部楼层
int *(*(*arr[5])())();
是这样的:
首先,arr[5]是一个指向函数指针的指针,*arr[5]就是取出地址为arr[5]所存储的信息。那么这里存储的是什么信息呢?它存储的是一个函数的地址,也就是说,*arr[5]是一个指向函数的指针。那么,*(*arr[5])()就是执行这个函数。而*(*arr[5])()这个函数做什么的呢?它具体做什么我也不知道……但是它的返回值是另一个函数的地址,也就是说,*(*arr[5])()的返回值是一个函数的指针。这样,*(*(*arr[5])())()就是执行*(*arr[5])()这个函数返回回来的那个函数,而*(*(*arr[5])())()的返回值类型是int*~
这样,int *(*(*arr[5])())();就可以很轻易的解释了~
sjinny怎么说也是这里的元老~就别劳他大驾来弄这种问题了~我解决好了~
回复

使用道具 举报

发表于 2004-8-31 20:31:44 | 显示全部楼层
[quote:42708fa4fb="sjinny"]恩……主要是目前我有项目在身,所以没法多来帮忙…… [/quote]我们只是组织者,几个人的时间、能力有限,多数社员能相互帮助才能将这个版活跃起来。最好在版面依然热闹的前提下大家忘记版猪的存在。
回复

使用道具 举报

发表于 2004-8-31 20:43:25 | 显示全部楼层
这样吧,我再说的明白些:
在arr[5]里面存储着一个变量,我们设其值为point
point存储的是一个函数的地址,我们设这个函数叫fun
那么,*arr[5]的值便是fun的地址。
这样,(*arr[5])()也就是执行fun这个函数。
那么,fun这个函数声明是什么呢?是:
void *fun(void);
其实,返回值不一定是void *,也可以是int * char *,但是,有点C基础的都知道,这些指针的实际实现是一样的。
那么fun返回的那个指针指向什么东西呢?它指向另一个函数。
换句话说,fun返回一个值,我们设这个值为ret。
我们再设一个函数fun1。
ret的值便是fun1的地址。
也就是说,执行fun后,它返回fun1的地址。
好了,现在我们执行完了fun(也就是我们执行了(*arr[5])())那么下一步呢?
下一步是取得fun的返回值,根据fun的返回值,执行fun1──因为fun的返回值是fun1的地址,所以,我们执行fun1就可以写为:(*fun())();
因为fun的地址是(*arr[5]),所以,执行fun也可以写为:(*arr[5])();
所以,执行fun1就是:(*(*arr[5]))();
那么,fun1( 也就是(*(*arr[5])) )的返回值是什么呢?是一个int *类型~
因此写作:int *(*(*arr[5])())();
回复

使用道具 举报

 楼主| 发表于 2004-9-1 09:54:01 | 显示全部楼层
高,实在是高!
回复

使用道具 举报

发表于 2004-9-1 16:58:00 | 显示全部楼层
所以非常非常讨厌c
回复

使用道具 举报

发表于 2004-9-1 19:56:04 | 显示全部楼层
[quote:8154ca0679="阿萨德非改行"]所以非常非常讨厌c[/quote]所以非迫不得已不要使用。
回复

使用道具 举报

发表于 2004-9-10 21:12:32 | 显示全部楼层
[quote:dc4f907c6d="sagaeon"][quote:dc4f907c6d="阿萨德非改行"]所以非常非常讨厌c[/quote]所以非迫不得已不要使用。 [/quote]
所以喜欢C
回复

使用道具 举报

发表于 2004-9-10 23:16:38 | 显示全部楼层
int *(*(*arr[5])())();

和这个有区别吗
int *(**arr[5]())();
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 13:57 , Processed in 0.065873 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表