10-20

作者: 帽子和五朵玫瑰 | 来源:发表于2018-06-27 09:58 被阅读0次

    495个问题 11-20

    11.extern在函数声明中是什么意思

    答:存储类型extern只对数据声明有意义,对于函数声明,他可以用作一种格式上的提示,表明函数的定义可能在另一个源文件中,但在

    extern int f();
    //和
    int f();
    

    之间没有实质区别

    12.关键字auto到底有什么用途。

    答:毫无用途,他已经过时了。

    13.对于用户定义类型,typedef和#deifne有什么区别

    答:一般来说,最好用typedef,部分原因是他能正确处理指针类型。例如,考虑这些声明:

    typedef char *Dtring_t;
    #define String_d char *
    String_t s1, s1;
    String_d s3, s4;
    

    s1 s2 s3都被定义成了char * ,但s4却被定义成了char型。这可能并非原来所希望的

    define也有它的优点,因为可以在其中饰演# ifdef,另一方面,typedef具有遵守作用域规则的优点(也就是说,他可以在一个函数或块内声明)

    14.我似乎不能成功定义一个链表。我试过

    typedef struct 
    {
        char *item;
        NODEPTR next;
    } *NODEPTR;
    

    编译器报了错误信息。难道在C语言中,结构不能包含指向自己的指针么?

    答:C语言中的结构当然可以包含指向自己的指针。

    这里的问题在于typedef。typedef定义了一个新的类型名称,在更简单的情况下,可以同时定义一个新的结构类型和typedef类型。但在这里不行,不能在定义typedef类型之前使用它,在上边的代码片段中,在next域声明的地方还没有定义NODEPTR。

    要解决这个问题,首先赋予这个结构一个标签(“struct node”)。然后,声明“next”域为“struct node * ”或者分开Typedef声明和结构定义,或者两者都采纳,以下是修正后的版本:

    typedef struct node
    {
        char *item;
        struct node *next;
    } *NODEPTR;
    
    //也可以在声明结构之前先用typedef,然后就可以在声明next域的时候使用类型定义NODEPTR了:
    
    struct node;
    typedef struct node *NODEPTR;
    struct node
    {
        char *item;
        NODEPTR next;
    };
    
    //这种情况下,你在struct node还没有完全定义的情况下就使用它来声明一个新的typedf,这时允许的,最后,这是一个两种建议都采纳的修改方法:
    
    struct node {
        char *item;
        struct node *next;
    };
    typedef struct node *NODEPTR;
    
    
    

    15.如何定义一对相互引用的结构?我试过

    typedef struct 
    {
        int afeild;
        BPTR bpointer;
    } *APTR;
    
    typedef struct 
    {
        int bfeild;
        APTR apointer;
    } *BPTR;
    

    但是编译器在遇到第一次使用BPTR的时候,他还没有定义。

    答:与问题1.14相似,这里的问题不在于结构或指针,而在于类型定义,首先,我们定义两个结构标签,然后(不用typedef)定义链接指针。

    struct a
    {
        int afeild;
        struct b *bpointer;
    };
    struct b
    {
        int bfeild;
        struct a *apointer;
    };
    
    

    对于结构a中的域定义struct b * bpointer, 尽管编译器此时尚未完成结构b(它在此还处于“未完成”阶段)的定义,但它仍可以接受。有时候需要在这对定义之前加上这一行:

    struct b;
    

    这个空声明将对这对结构声明(如果处于某个内部作用域)同外部作用域的struct b区分开来。

    声明了两个带结构标签的结构之后,可以再分别定义两个类型。

    typedef struct a *APTR;
    typedef struct b *BPTR;
    //另外也可以先定义两个类型,然后再使用这些类型来定义链接指针域。
    struct a;
    struct b;
    typedef struct a *APTR;
    typedef struct b *BPTR;
    struct a {
        int afeild;
        BPTR bpointer;
    };
    struct b {
        int bfeild;
        APTR apointer;
    }
    

    17"typedef int (* funcptr)()"是什么意思

    答:他定义了一个类型funcptr,表示指针返回值为int型的函数指针,他可以用来声明一个或多个函数指针

    funcptr fp1, fp2;

    这个声明等价于以下这种更冗长而且可能更难理解的写法

    int (* fp1)(), (* fp2)();

    相关文章

      网友评论

          本文标题:10-20

          本文链接:https://www.haomeiwen.com/subject/pmxbyftx.html