| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 987 人关注过本帖
标题:高手帮帮忙吗,这个函数名能这么定于吗 这么解析啊
只看楼主 加入收藏
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
 问题点数:0 回复次数:14 
高手帮帮忙吗,这个函数名能这么定于吗 这么解析啊
void (*tree_get(void))(void) {
    void (*self)(void);

    self = tree_val[tree_idx];

    return self;
}
搜索更多相关主题的帖子: return 
2011-12-31 16:39
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
得分:0 
不懂不懂啊 这是别人的代码 应该是没有错误的 可我就是想不明白。函数名字还能这样写吗  这算是什么
2011-12-31 16:40
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
得分:0 
就没人会吗  这个函数我运行了 是可以这么定义的  但是这么解释呢 我要调用的话,怎么调用呢  (*tree_get(void))(void) ;写这个吗
2011-12-31 17:03
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
得分:0 
  .
2011-12-31 17:31
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
void (*tree_get(void))(void) {
    void (*self)(void);

    self = tree_val[tree_idx];

    return self;
}

 void (*self)(void); 定义一个指针,这个指针指向一个函数,而这个函数不需要参数也不返回什么东西。


void (*tree_get(void))(void) {
    void (*self)(void);

    self = tree_val[tree_idx];

    return self;
}
这个的话,tree_get是一个函数,tree_get函数返回一个指针(这个指针也是指向一个函数的,这个函数不需要参数也不返回什么东西),*是对这个指针的解引用。
这个按运算符的结合顺序理解会容易一点
tree_get(void)      *tree_get(void)    void (*tree_get(void))(void)

 return self;   我就不理解了!函数前面都有void了,还可以返回指针?

以上都是个人见解,不一定对哦!

[ 本帖最后由 饭桶 于 2011-12-31 18:48 编辑 ]

人得一生得奋斗!
2011-12-31 18:46
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
得分:0 
回复 5楼 饭桶
谢谢你哈 我懂了 呵呵  你说的是对的 不过后面你怎么还自己搞不明白了呢  这个函数名师tree_get,返回值是一个指向函数返回值为void 函数也为void的指针,所以后面return 返回的是self  前面定义了tree_val【】  是一个函数指针数组,我没往上展台粘贴罢了。。但还是谢谢你 你理解的是对的  我是用软件发现的  发现这个函数的返回值是void (*(void))  我立刻就懂了 呵呵  一起学习哈。。。
2012-01-03 08:15
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
程序代码:
#include <stdio.h>

void cc(void)
{
    printf("cc!\n");
}

void (*tree_val[])(void) = {cc};
unsigned int tree_idx = 0;

void (*tree_get(void))(void)
{
    return tree_val[tree_idx]; //注释掉这句,看编译器输出
}

int main(int argc, char *argv[])
{
    void (*k)(void);
    k = tree_get();
    k();
    return 0;   
}

技术问题,请不要以短消息方式提问
2012-01-03 09:58
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
得分:0 
回复 7楼 zaixuexi
懂了  vs2008中  你在函数上点击一下,属性栏上就有一项是Typestring就是返回类型 ,上面写的是void(*(void))。
2012-01-03 10:38
dongmeteor
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-12-31
收藏
得分:0 
回复 7楼 zaixuexi
问问高手
void menu_process(int32 refresh, int32 key_value)
{
    int32    (*func)(int32, int32);
    int32    flg;

    func = (int32 (*)(int32, int32))tree_get();   
    flg = (*func)(refresh, key_value);
    //进入子节点
    if(flg == TREE_CHILD) {
        func = (int32 (*)(int32, int32))tree_get();
        (*func)(REFRESH_INIT, INVALID);
    //返回父节点
    }else if(flg == TREE_FATHER) {
        func = (int32 (*)(int32, int32))tree_get();
        (*func)(REFRESH_ALL, INVALID);
    }

}    这个函数里面是怎么调用上面的tree_get函数的,tree_get是无参数的,返回值是一个指向函数的指针,这个函数返回值类型是void,参数也是void型,不过这里func = (int32 (*)(int32, int32))tree_get();
却强制转换成 (int32 (*)(int32, int32))这个类型,那转换完后,(*func)(REFRESH_INIT, INVALID);
里面的两个参数怎么应用啊。
2012-01-03 11:46
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
程序代码:
#include <stdio.h>

int cc(int key, int val)
{
    printf("key=%d, val =%d!\n", key, val);
    return key * val;
}

typedef void(*template)(void);

void (*tree_val[])(void) = {(template)cc};
unsigned int tree_idx = 0;

void (*tree_get(void))(void)
{
    return tree_val[tree_idx];
}

int main(int argc, char *argv[])
{
#define REFRESH_INIT       (0)
#define INVALID            (-1)

    int (*func)(int, int);
    func = (int(*)(int, int))tree_get();
    printf("func ret = %d",func(REFRESH_INIT, INVALID));
    return 0;   
}
就是强转一下

技术问题,请不要以短消息方式提问
2012-01-03 12:02
快速回复:高手帮帮忙吗,这个函数名能这么定于吗 这么解析啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026395 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved