【问题标题】:Typedef/Global structure in C, without using "typedef"?C中的Typedef / Global结构,不使用“typedef”?
【发布时间】:2020-04-13 02:27:29
【问题描述】:

语言:C

我希望我知道如何在标题中更好地引用它。我最近遇到了这段关于结构定义的代码,我不熟悉语法,尤其是“*Node”部分。有人可以帮我理解发生了什么吗?为什么/我们不使用 typedef/ 这完全是另外一回事吗?为了进一步参考,源代码在某些函数定义中使用“节点”(没有*星号),而没有在函数本身中传递或声明任何“节点”变量。这让我认为这是某种全局变量声明。任何帮助表示赞赏!

struct node {
    char word[MAX];
    struct node *left;
    struct node *right;
} *Node;

【问题讨论】:

    标签: c data-structures struct global-variables typedef


    【解决方案1】:

    struct 声明中,结束成员列表的右大括号后面可以跟变量列表。所以,这里

    struct node {
        char word[MAX];
        struct node *left;
        struct node *right;
    } *Node;
    

    Nodestruct node * 类型,它可以保存任何struct node 类型变量的指针。这意味着,如果你有

    struct node anode;
    

    你可以的

    Node = &anode;
    

    如果你有这种全局 struct 声明,后跟右括号后的变量,终止成员列表,那么所有这些变量都是 struct 类型的全局变量。这意味着,如果你有

    struct node {
        char word[MAX];
        struct node *left;
        struct node *right;
    } Node, *ptrNode;
    

    而这个struct node 类型是全局定义的,那么NodeptrNode 都是全局变量。

    不要将此与typedef 混淆。 typedef 用于为另一种数据类型创建别名。

    例如

    tyepdef struct node {
        char word[MAX];
        struct node *left;
        struct node *right;
    } stNode, *ptrStNode;
    

    现在stNodestruct node 的别名,ptrStNodestruct node * 的别名。也就是说,您可以使用它们分别声明struct nodestruct node* 类型的变量。

    对于struct node 类型,这个

    stNode aNode;
    

    相同
    struct node aNode;
    

    对于struct node * 类型,这个

    ptrStNode ptrNode;
    

    相同
    stNode *ptrNode;
    

    相同
    struct node *ptrNode;
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      代码将指针名称Node 定义为struct。见declare Node as pointer to struct node

      也许分解成两步等效代码更容易理解。

        // Define `struct node`
        struct node {
            char word[MAX];
            struct node *left;
            struct node *right;
        };
      
        // Define & declare a pointer: `Node`
        struct node *Node;
      

      我们为什么/如何不使用 typedef/ 这完全是另外一回事吗?

      作者不想通过typefacestruct main 类型定义别名。只需定义一个名为struct main 的类型并声明一个指针。

      【讨论】:

      • 所以它确实只是变量声明的语法和全局语法?
      • @KRKClutch "...and a global one at that" 如果代码不在函数中,那么是的,全局对象调用Node
      • 但是作者确实定义了一个类型,并且是一个可重用的类型。 OP 似乎认为这样做需要使用typedef,但当然不是这样。 struct node 是一个非常好的类型。
      • @JohnBollinger 是的,因为定义了struct main 类型,所以措辞不好。答案已修改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多