zoukankan      html  css  js  c++  java
  • 黑马程序员--C语言基础之--结构体详解

     

    ------IOS培训期待与您交流! -------

     

    在实际应用中,某个对象由不同类型的数据组成,比如学生的姓名为字符串型,学号可为整形或者字符串型,性别为枚举类型,身高为浮点型。

    很显然,不可能用一个数组来存放这些数据。C语言用一种构造数据类型——结构体来表示这个对象。

    一、定义结构体变量

    结构体和枚举一样,需要先定义结构体,再定义结构体变量。

    1、定义结构体:struct是结构体的关键字,定义一个结构体的一般形式为:

    /*
    struct 结构体名{
    数据类型1 成员名1;
    数据类型2 成员名3;
    ......
    数据类型n 成员名n;
    };
    */
    
    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    };

    2、定义结构体变量

    定义好结构体之后,就可以定义结构体变量。常见的3种定义结构体变量方式:

    (1) 先定义结构体类型,再定义变量

    (2) 定义结构体类型的同时定义变量

    (3) 直接定义结构体类型变量,省略类型名

    /*
    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    };
    struct Student stu; //第一种方式 //第二种方式 struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    } stu; //第三种方式 struct {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    } stu;

    二、定义结构体的注意事项

    (1) 结构体内部的数据类型不能是该结构体本身,即不能递归定义

    (2) 结构体内部的数据类型可以是已经定义好的结构体

    (3) 定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。只有当定义属于结构体类型的变量时,

    系统才会分配存储空间给该变量

    (4) 结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列

    /*
    struct Student {
        char *name; // 姓名
        int age; // 年龄
        float height; // 身高
        Student stu;  //   结构体内部的数据类型不能是该结构体本身
    };  */   
    
    struct Date {
        int year;
        int month;
        int day;
    };
    
    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    Date birthday; //结构体内部的数据类型可以是已经定义好的结构体
    }; //此时并没有分配存储空间 struct Student stu; //给变量stu分配存储空间 struct { char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    } stu; //stu占用的内存空间,4 + 4 + 4 = 12

    三、 结构体变量的初始化

    初始化结构体变量有两种发法:

    (1) 将各成员的初值,按顺序地放在一对大括号{}中,并用逗号分隔,一一对应赋值。

    (2) 在大括号内,将点和成员名组合在一起,并赋值,成员名的顺序是任意的。

    要注意的是,只能在定义变量的同时进行初始化赋值,初始化赋值和变量的定义不能分开。

    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高 }; struct Student stu = {"zhangsan",12,165.7f}; //第一种方法初始化
    struct Student stu1 = {.age = 12,.name = "zhangsan"}; //第二种方法初始化 /*错误的初始化 struct Student stu;
    stu = {"zhangsan",12,165.7f};
    */

    四、访问结构体变量的成员

    (1) 一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:结构体变量名.成员名。

    (2) 如果某个成员也是结构体变量,可以连续使用成员运算符"."访问最低一级成员。

    (3) 相同类型的结构体变量之间可以进行整体赋值。

    struct Date {
        int year;
        int month;
        int day;
    };
    
    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    Date birthday;
    };
    struct Student stu; //给变量stu分配存储空间 stu.age = 17; //给成员变量赋值
    stu.birthday.year = 2000; //给结构体成员的成员赋值 struct Student stu1 = stu; //将stu直接赋值给stu1

    五、结构体数组

    (1) 定义结构体数组变量和定义结构体变量一样,有三种方式。初始化也和结构体变量一样。

    (2) 结构体数组的访问方式和数组一样。

    struct Date {
        int year;
        int month;
        int day;
    } date[3];  //定义结构体数组变量
    
    struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高 };
    struct Student stu[2] = {{"zhangsan",14,123.6f},{.name = "lisi",.age = 12}}; //定义结构体数组变量,并初始化 struct {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
    } stus[3]; //定义结构体数组变量
    stus[0].age = 12; //给结构体数组成员赋值

    六、指向结构体的指针

    (1) 结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。

    (2) 结构体指针变量的定义形式:struct 结构体名称 *指针变量名。

    (3) 结构体指针访问结构体成员的方法:

    第一种:(*指针变量名).成员名

    第二种:指针变量名->成员名

    struct Date {
        int year;
        int month;
        int day;
    } ;  //定义结构体数组变量
    
    struct Date date = {2001,12,12};
    
    struct Date *p = &date;
    
    (*p).year = 1990;   //第一种方式,给结构体赋值
    p->month = 11; //第二种方式,给结构体赋值
  • 相关阅读:
    在中文版VS2008中安装MVC
    【原创】最优惠的企业邮局
    【推荐】双模虚拟主机 WINDOWS经济型或 UNIX经济型
    CSS基础
    第一篇文章
    一道面试题
    IIS做web server有些中文名文件不能下载
    偶遇指间流沙
    迷失的女孩
    身边的小故事二则
  • 原文地址:https://www.cnblogs.com/waterfox/p/4370526.html
Copyright © 2011-2022 走看看