zoukankan      html  css  js  c++  java
  • struct与typedef struct的区别

    一、匿名struct

    #include<stdio.h>
    #include<stdlib.h>
    
    struct {
       int age;
       float weight;
    } person;
    
    int main()
    {
        struct person *ptr;
        ptr = (struct person*)malloc(sizeof(struct person));
        ptr->age = 10;
        ptr->weight = 55.5;
    }

    报错error: dereferencing pointer to incomplete type 'struct person',

    其实这段代码是申明一个匿名结构体,定义一个叫person的变量

    #include<stdio.h>
    #include<stdlib.h>
    
    struct {
       int age;
       float weight;
    } person;
    
    int main()
    {
        person.age = 10;
        person.weight = 55.5;
    }

    这样就ok.

    二、struct在C和C++中的区别

    #include<stdio.h>
    #include<stdlib.h>
    
    struct person {
       int age;
       float weight;
    };
    
    int main()
    {
        person *ptr;
        ptr = (person*)malloc(sizeof(person));
        ptr->age = 10;
        ptr->weight = 55.5;
        printf("%s", "Successful.");
    }

    这段代码,在C++中没问题,但在C中会编译错误。原因在于C中使用结构体需要struct person.

    如下所示:

    #include<stdio.h>
    #include<stdlib.h>
    
    struct person {
       int age;
       float weight;
    };
    
    int main()
    {
        struct person *ptr;
        ptr = (struct person*)malloc(sizeof(struct person));
        ptr->age = 10;
        ptr->weight = 55.5;
        printf("%s", "Successful.");
    }

    还有一种方法就是,使用typedef给struct person一个别名。当然,person这个类型名还能用。除外这个别名也可以是person.

    #include<stdio.h>
    #include<stdlib.h>
    
    struct person {
       int age;
       float weight;
    };
    
    typedef struct person Person;
    
    int main()
    {
        Person *ptr;
        ptr = (struct person*)malloc(sizeof(Person));
        ptr->age = 10;
        ptr->weight = 55.5;
        printf("%s", "Successful.");
    }

    三、typedef与匿名结构体结合

    上面我是将typedef xx  xx写成单独的一行,其实可以与struct的定义结合

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct person{
       int age;
       float weight;
    }Person;
    
    int main()
    {
        Person *ptr;
        ptr = (Person*)malloc(sizeof(Person));
        ptr->age = 10;
        ptr->weight = 55.5;
        printf("%s", "Successful.");
    }

    这里person其实没有用,因为后面都是用Person,所以我们采用匿名的

    typedef struct{
       int age;
       float weight;
    }Person;

    四、单链表中节点的定义

    特点就是结构体里有该结构体类型的指针,例如

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct node{
       int value;
       struct node* next;  // 注意,这里必须带struct
    }Node, *LinkList;
    
    int main()
    {
        Node *ptr;
        ptr = (Node*)malloc(sizeof(Node));
        ptr->value = 1;
        ptr->next = NULL;
        printf("%s", "Successful.");
    }

    这里Node和LinkList都是类型名,而不是变量名。

    Node是节点类型,LinkList是节点指针类型,Node*就等同于LinkList.

  • 相关阅读:
    string.Format组合跳转路径
    jquery 设置asp:dropdownlist 选中项
    asp:UpdatePanel中js失效问题已解决
    repeater 一个td多个div显示图片
    aps.net js获取服务器控件
    nfs—文件转换器
    Linux之文件权限
    关于Linux与Windows的在服务器的一些区别
    关于Linux目录结构的理解
    新的旅程
  • 原文地址:https://www.cnblogs.com/lfri/p/13432485.html
Copyright © 2011-2022 走看看