Chinaunix

标题: 请教个问题,typedef void (*Fun) (void) 该如何理解 [打印本页]

作者: 魔鬼的惊叹    时间: 2014-12-01 20:30
标题: 请教个问题,typedef void (*Fun) (void) 该如何理解
查了很多资料都说是定义了一个函数指针类型。但是从typedef的语法上来看真的很难理解。可能有点钻牛角尖了吧,有没有哪位高手解释下。
作者: hejianet    时间: 2014-12-01 20:38
百度 c 语言 复杂声明
作者: xphh2008    时间: 2014-12-01 22:04
还真不知道,感觉像是编译规则一个比较例外的设置。

我是这么记忆的:
typedef void (*func)(void);

typedef (void)(void) func;
的简化。

不过在结构体里,可以直接这样声明:
struct {
    void func(void);
}
我比较喜欢这样自然的方式。




作者: wangspace    时间: 2014-12-01 22:48
typedef void (*func)(void);
func表示一个指向函数的指针类型的名字,该指针类型为”指向返回void类型并且无参数的函数的指针“
可以使用函数名对函数指针进行初始化:


作者: JunC_1992    时间: 2014-12-02 08:46
func是一個函數指針,可以看這幾個比較容易理解的例子(C primer plus 第5版 中文版 P413):
        typedef   int   arr5[5];
            typedef   arr5*   p_arr5;
            typedef   p_arr5   arrp10[10];

            arr5    togs;                     //togs是具有5个元素的int数组
        p_arr5    p2;                    //p2是一个指针,指向具有5个元素的int数组
        arrp10    ap;                    //ap是具有10个元素的指针数组,每个指针指向具有5个元素的int数组
做个比较,typedef void (*func)(void) 也就不太晕了。
作者: zsszss0000    时间: 2014-12-02 09:00
这种关于指针的问题,建议你阅读一下《征服C指针》,说的很清楚明白!
作者: JunC_1992    时间: 2014-12-02 09:14
额…func是类型啊,少打了类型俩字。回复 5# JunC_1992


   
作者: super皮波    时间: 2014-12-02 09:44
typedef void (*func)(void);

void myfunc(void);

func pfun = myfunc;/*赋值*/

pfun();/*调用*/
作者: yulihua49    时间: 2014-12-02 09:44
魔鬼的惊叹 发表于 2014-12-01 20:30
查了很多资料都说是定义了一个函数指针类型。但是从typedef的语法上来看真的很难理解。可能有点钻牛角尖了吧 ...

typedef void (*) (void) Fun;
能理解不?
作者: wangspace    时间: 2014-12-02 09:58
回复 8# super皮波
对  是这个意思


   
作者: codechurch    时间: 2014-12-02 10:39
从id开始,一层层向外读,先右后左,加括号优先读。

如: (*a) []  读: a是指针,指向数组
      *a []   等价于  *(a[])   读:a是数组,元素是指针


id是a

int a;  ///   无,  整数  /// 意思就是: a就是a,内容是整数
int a[N] ;   /// a是数组,元素是整数
int *a;   /// a是指针,指针指向整数
int  a() ; /// a是函数,返回整数
int *a [] ;    /// a是数组(a[]),元素指向整数的指针
int (*a)();   ///  a是指针,指向函数,此函数返回整数
int * (* (* a)() )  ();  
///  a是指针(1),指向函数(1),函数(1)返回指针(2),指针(2)指向函数(2),函数(2)返回指针(3),指针(3)指向整数

int  ***a;
/// a是指针1,指向指针2,指针2指向指针3,指针3指向整数





作者: codechurch    时间: 2014-12-02 10:42
接上,加了typedef 其实跟不加差不多,只是:

不加typedef,id是变量名或数组名、函数名等。
加了typedef,id就是指那个类型。



作者: zsszss0000    时间: 2014-12-02 10:43
你这种形式非常好理解,这么写,编译器能通过吗?回复 9# yulihua49


   
作者: codechurch    时间: 2014-12-02 10:44
而且,我不建议写成

int (*)() a;

还是经典的形式比较通用。


作者: 魔鬼的惊叹    时间: 2014-12-02 11:22
回复 11# codechurch


多谢啊,现在明白了,原来一直觉得c语言学的还行,至少理解内存,理解指针了,现在突然发现还有好多东西不理解,指针确实是c语言的精髓啊
作者: super皮波    时间: 2014-12-02 11:28
回复 15# 魔鬼的惊叹
你才刚上路啊


   
作者: zsszss0000    时间: 2014-12-02 12:51
int * (* (* a)() )  ();  
是不是可以理解为
(int * (*)()) a()回复 11# codechurch


   
作者: codechurch    时间: 2014-12-02 15:19
zsszss0000 发表于 2014-12-02 12:51
int * (* (* a)() )  ();  
是不是可以理解为
(int * (*)()) a()回复 11# codechurch



肯定不对,立刻就可以知道,你看:

int * (* (* a)() )  ();     /// 这里,a是指针    /// 看 (*a)  读: a是指针

(int * (*)()) a();     /// 这里,a是函数名,    a() 先结合,读: a是函数(名)




int * (* (* a)() )  ();    /// 这里,a首先是一个指针,这个指针指向一个函数,这个函数的类型如下:

   
    typedef  int * (* B())() ;   

         /// 这个类型B,看上去很怪,个别编译器可能不支持,但c语义上没错。
         /// B是一个函数类型,函数的返回值是一个指针,而这个指针指向函数,这个函数的返回类型是指向整数的指针。

要看如何结合,

     int ***a [];   等价于   int (*** (a[]) );  /// 这就是指针数组,比较常见。即:a是个数组,数组元素的类型是三级指针,最低级指向整数。

而下面不太常见:

     int (***a) [] ; /// a是个三级指针,最低级指向数组,数组的元素是整数

     
      




作者: codechurch    时间: 2014-12-02 15:26
void (*Fun)();

就拿这个简单的例子来说吧:

(1)  (*Fun)            读: fun是个指针
(2)  (*Fun)()          读: fun是个指针,指向函数
(3)void (*Fun)();   读: fun是个指针,指向函数,函数返回值为void


作者: zsszss0000    时间: 2014-12-03 08:59
大学的老师,也很少能像你这样讲授C语言的函数指针的,NB回复 19# codechurch


   
作者: 1209996322    时间: 2016-03-14 11:42
通俗易懂!!!回复 3# xphh2008


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2