美文网首页
C语言结构体知识点记录

C语言结构体知识点记录

作者: 超级皮波9 | 来源:发表于2018-09-09 14:23 被阅读0次

    一.结构体

    1. 概念
    • 结构体是构造类型的一种
    • 构造类型前面还有数组
    • 数组的作用是用于储存一组相同类型的数据
    • 结构体的作用是用于储存一组不同类型的数据
    1. 如何定义
    • 先定义结构体的类型
    • 通过结构体的类型定义结构体的变量
    **定义结构体的类型**
    //格式
    struct  结构体类型名称{
            数据类型  属性名称 ;
            数据类型  属性名称 ;
            };
    //例子 定义结构体Person
    struct  Person {
            char *name;
            int  age;
            double height;
            };  //分号注意一定要写
    
    **定义结构体的变量**
    //格式
    struct 结构体类型名称  变量名称;
    //例子 定义结构体变量 P
    struct Person  p;
    
    **使用结构体变量**
    //格式
    结构体变量 . 结构体属性名称
    //例子
    p.name = "小明";
    p.age = 10;
    p.height = 1.8;
    

    二 . 结构体变量的初始化

    1. 定义的同时初始化
    • 注意: 如果定义的同时初始化,那么初始化的顺序必须和结构体类型中的顺序一致
    #include <stdio.h>
    int main(){
        //定义结构体
        struct Person{
            char name;
            int age;
            int money;
        };
        //定义结构体变量同时初始化
        struct Person p = {"jack",22,1000};    
        return 0;
    }
    
    1. 先定义再初始化
    #include <stdio.h>
    int main(){
        //定义结构体
        struct Person{
            char name;
            int age;
            int money;
        };
        //定义结构体变量 先定义再初始化
        struct Person p;
        p.name = "jack";
        p.age = 22;
        p.money = 100000;
       
        return 0;
    }
    

    三.定义结构体变量的方式

    1. 先定义结构体类型,在定义结构体变量
    #include <stdio.h>
    
    int main(){
        
        //定义结构体
        struct Person{
            char name;
            int age;
            int money;
        };
        //定义结构体变量
        struct Person p;
        
        return 0;
    }
    
    1. 定义结构体类型的同时定义结构体变量
    #include <stdio.h>
    
    int main(){
    
        //定义结构体
        struct Person{
            char name;
            int age;
            int money;
        } p; //结构体变量p
    
        return 0;
    }
    
    1. 定义结构体类型的同时省略结构体名称,同时定义结构体变量
    • 为匿名结构体 特点 : 结构体类型只能使用一次
    #include <stdio.h>
    
    int main(){
    
        //定义结构体 
        struct {
            char name;
            int age;
            int money;
        } p; //结构体变量p
    
        return 0;
    }
    

    4 . 结构体类型的作用域

    • 作用域和变量的作用域一样

    5 . 结构体内存分析

    注意点

    1. 给整个结构体变量分配储存空间和数组一样,从内存地址比较大的开始分配
    2. 给结构体变量中的属性分配储存空间也和数组一样,从所占内存地址比较小的开始分配
    3. 定义结构体类型不会分配储存空间,只有定义结构体变量的时候才会分配储存空间
    • 结构体在分配内存的时候,会做一个内存对齐的操作
    • 会先获取所有属性中占用内存最大的属性的字节数
    • 然后在开辟出最大属性字节的内存给第一个属性,如果分配给第一个属性之后还能继续分配给第二个属性,那么就继续分配给第二个属性
    • 如果分配给第一个属性之后,剩余的内存不够分配给第二个属性了,那么会再次开辟最大属性的内存,再次分配 依次类推
    #include <stdio.h>
    
    int main(){
    
        //定义结构体
        struct Person {
            char name; // 1 个节点  //开辟4个字节 char 占用1个
            int age;  // 4个字节   // 剩余三个 不够int  再开辟4个字节
            int money; // 4个字节 // 再开辟4个字节
        };
    
        struct Person p; // 所以p = 4+4+4
    
        printf("sizeof(p) = %i\n",sizeof(p)); // 12个字节
        return 0;
    }
    

    六 .结构体和指针

    • 结构体指针
      因为结构体变量也会分配内存空间,所以结构体变量也有内存地址,所以可以使用指针保存结构体变量的地址

    • 规律
      定义结构体变量的指针的方法和定义普通变量的方法一样
      如果指针指向了结构体变量,那么访问结构体变量的方法就有三中
      1.结构体变量.属性名称
      2.(*结构体指针变量名称).属性名称
      3.结构体指针变量名称->属性名称

    #include <stdio.h>
    
    int main(){
    
        //定义结构体
        struct Person {
            char *name;
            int age;
            int money;
        };
    
        struct Person per = {"小明",22,100};
    
        struct Person *p = &per;
    
        printf("per.name = %s\n",per.name);  // 1. per.name = 小明
        printf("(*p).name = %s\n",(*p).name);  // 2. (*p).name = 小明
        printf("p->name = %s\n",p->name); //3. p->name =小明
        return 0;
    }
    

    七 . 结构体嵌套定义

    • 结构体的属性可以又是一个结构体 , 提高代码的复用性
    #include <stdio.h>
    
    int main(){
    
        //定义一个日期的结构体
        struct Date{
            int year;
            int month;
            int day;
        };
        //定义人的结构体
        struct Person{
            char *name;
            int age;
            struct Date birthday; // 嵌套定义日期的结构日
        };
    
        struct Person p = {"小明",22,{2018,9,9}}; // 初始化
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C语言结构体知识点记录

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