• 结构体声明与初始化


    目录

    一、结构体声明的结构

    1.直接声明

    2.使用typedef声明一个新的类型

    3.不完全声明

    二.结构体初始化

    1.声明(同时定义)时直接赋值

    2.定义时直接赋值

    3.定义后赋值

    4.指定初始化


    一、结构体声明的结构

    1.直接声明

    1. struct tag {
    2. member-list;
    3. member-list;
    4. member-list;
    5. ...
    6. } variable-list;

            tag 是结构体类型的标签。

            member-list 结构体的元素定义,比如 int i; 或者 float f,或者其他有效的变量定义。注意此处使用“;”结尾

            variable-list 结构体变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。结构体标签和结构体变量可以不必同时出现

    2.使用typedef声明一个新的类型

    1. typedef struct
    2. {
    3. int a;
    4. char b;
    5. double c;
    6. } Simple_t;
    7. Simple_t u1, u2[20], *u3;

            现在可以用Simple_t作为类型声明新的结构体变量。

    3.不完全声明

            (C99 6.2.5)不完整类型(incomplete types):与对象类型相反,包括那些类型信息不完整的对象类型(incompletely-defined object type)以及空类型(void)。

            有时候,必须声明一些相互之间存在依赖的结构,可能是自包含,也可能互相依赖,这时就需要不完全声明。

    情况一:自包含

    1. //此结构体的声明包含了指向自己类型的指针
    2. struct NODE
    3. {
    4. char string[100];
    5. struct NODE *next_node;
    6. };

    情况二:互相包含

    1. struct B; //对结构体B进行不完整声明
    2. //结构体A中包含指向结构体B的指针
    3. struct A
    4. {
    5. struct B *partner;
    6. //other members;
    7. };
    8. //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
    9. struct B
    10. {
    11. struct A *partner;
    12. //other members;
    13. };

            注意:以上两种结构体声明中的元素都是指针指向结构体,没有遇到过不是指针的(理论上也不可行)。

            注意:要分清结构体类型声明和变量定义(声明是不会占用内存空间的,而变量定义会占用相应内存空间)。如:

    1. struct Student{ //声明结构体
    2. char name[20]; //姓名
    3. int num; //学号
    4. float score; //成绩
    5. };

    是结构体类型声明;

    struct Student student1;

    是结构体变量定义;

    1. struct Student{ //声明结构体
    2. char name[20]; //姓名
    3. int num; //学号
    4. float score; //成绩
    5. }student1;

    是结构体类型声明的同时定义一个结构体变量。

    二.结构体初始化

    1.声明(同时定义)时直接赋值

    1. struct Books
    2. {
    3. char title[50];
    4. char author[50];
    5. char subject[100];
    6. int book_id;
    7. } book = {"C 语言", "RUNOOB", "编程语言", 123456};

    2.定义时直接赋值

    1. # include <stdio.h>
    2. struct AGE
    3. {
    4. int year;
    5. int month;
    6. int day;
    7. };
    8. struct STUDENT
    9. {
    10. char name[20];
    11. int num;
    12. struct AGE birthday;
    13. float score;
    14. };
    15. int main(void)
    16. {
    17. struct STUDENT student1 = {"小明", 1207041, {1989, 3, 29}, 100};
    18. return 0;
    19. }

    注意:STUDENT是结构体类型的标签,而不是结构体变量

    3.定义后赋值

    1. struct STUDENT student1;
    2. student1.num = 1207041;

    4.指定初始化

    (C99标准)指定初始化(designated initializer),指定部分/全部元素初始化。

    1. struct book gift =
    2. {
    3. .value = 25.99,
    4. .author = "James Broadfool",
    5. .title = "Rue for the Toad"
    6. };

    注意:最后一个元素赋值后边加不加逗号都没有问题。

  • 相关阅读:
    代码随想录算法训练营Day52|动态规划11
    Python3 API 的封装及调用
    vue3中使用element-plus
    OpenAI 推出ChatGPT Edu,为高校定制版本
    中文编程工具免费版下载,中文开发语言工具免费版下载
    git 命令使用
    如何在Spring JDBC 中获取自动生成的 ID
    如何删除MySQL服务
    Jenkins List Git Branches插件 构建选择指定git分支
    document.getElementById()获取一直为null
  • 原文地址:https://blog.csdn.net/zyl615110/article/details/125595267