• C语言速记6(结构体)


    结构体写法形式有点像枚举,本身意义更像数组,但可以是一组不同类型的数据。

    1,用结构体表示一本书的数据:

    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    } book;

    结构体的形式:

    struct tag { 
        member-list
        member-list 
        member-list  
        ...
    } variable-list ;

    在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为实例:

    1//这个结构体并没有标明其标签
    struct 
    {
        int a;
        char b;
        double c;
    } s1;
    
    2//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
    //结构体的标签被命名为SIMPLE,没有声明变量
    struct SIMPLE
    {
        int a;
        char b;
        double c;
    };
    //用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
    struct SIMPLE t1, t2[20], *t3;
     
    3//也可以用typedef创建新类型
    typedef struct
    {
        int a;
        char b;
        double c; 
    } Simple2;
    //现在可以用Simple2作为类型声明新的结构体变量
    Simple2 u1, u2[20], *u3;

    1,和2的声明会被编译器当作两个完全不同的类型,如果令 t3=&s1,则是非法的。

    个人理解就像java中类的成员一样,如果类名称不一,依然是两个不同类。

    2,结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针

    //此结构体的声明包含了其他的结构体
    struct COMPLEX
    {
        char string[100];
        struct SIMPLE a;
    };
     
    //此结构体的声明包含了指向自己类型的指针
    struct NODE
    {
        char string[100];
        struct NODE *next_node;
    };

    3,如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明

    这样好理解,要用之前至少大概类型占位符占个坑吧

    struct B;    //对结构体B进行不完整声明
     
    //结构体A中包含指向结构体B的指针
    struct A
    {
        struct B *partner;
        //other members;
    };
     
    //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
    struct B
    {
        struct A *partner;
        //other members;
    };

    4,定义时指定初始值

    #include <stdio.h>
     
    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    } book = {"C 语言", "RUNOOB", "编程语言", 123456};
     
    int main()
    {
        printf("title : %s
    author: %s
    subject: %s
    book_id: %d
    ", book.title, book.author, book.subject, book.book_id);
    }

    执行:
    title : C 语言
    author: RUNOOB
    subject: 编程语言
    book_id: 123456

    5,访问结构成员

    使用成员访问运算符点(.),使用 struct 关键字来定义结构类型的变量

    #include <stdio.h>
    #include <string.h>
     
    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    };
     
    int main( )
    {
       struct Books Book1;        /* 声明 Book1,类型为 Books */
       struct Books Book2;        /* 声明 Book2,类型为 Books */
     
       /* Book1 详述 */
       strcpy( Book1.title, "C Programming");
       strcpy( Book1.author, "Nuha Ali"); 
       strcpy( Book1.subject, "C Programming Tutorial");
       Book1.book_id = 6495407;
     
       /* Book2 详述 */
       strcpy( Book2.title, "Telecom Billing");
       strcpy( Book2.author, "Zara Ali");
       strcpy( Book2.subject, "Telecom Billing Tutorial");
       Book2.book_id = 6495700;
     
       /* 输出 Book1 信息 */
       printf( "Book 1 title : %s
    ", Book1.title);
       printf( "Book 1 author : %s
    ", Book1.author);
       printf( "Book 1 subject : %s
    ", Book1.subject);
       printf( "Book 1 book_id : %d
    ", Book1.book_id);
     
       /* 输出 Book2 信息 */
       printf( "Book 2 title : %s
    ", Book2.title);
       printf( "Book 2 author : %s
    ", Book2.author);
       printf( "Book 2 subject : %s
    ", Book2.subject);
       printf( "Book 2 book_id : %d
    ", Book2.book_id);
     
       return 0;
    }
    
    输出:
    Book 1 title : C Programming
    Book 1 author : Nuha Ali
    Book 1 subject : C Programming Tutorial
    Book 1 book_id : 6495407
    Book 2 title : Telecom Billing
    Book 2 author : Zara Ali
    Book 2 subject : Telecom Billing Tutorial
    Book 2 book_id : 6495700

    6,结构作为函数参数

    #include <stdio.h>
    #include <string.h>
     
    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    };
     
    /* 函数声明 */
    void printBook( struct Books book );
    int main( )
    {
       struct Books Book1;        /* 声明 Book1,类型为 Books */
       struct Books Book2;        /* 声明 Book2,类型为 Books */
     
       /* Book1 详述 */
       strcpy( Book1.title, "C Programming");
       strcpy( Book1.author, "Nuha Ali"); 
       strcpy( Book1.subject, "C Programming Tutorial");
       Book1.book_id = 6495407;
     
       /* Book2 详述 */
       strcpy( Book2.title, "Telecom Billing");
       strcpy( Book2.author, "Zara Ali");
       strcpy( Book2.subject, "Telecom Billing Tutorial");
       Book2.book_id = 6495700;
     
       /* 输出 Book1 信息 */
       printBook( Book1 );
     
       /* 输出 Book2 信息 */
       printBook( Book2 );
     
       return 0;
    }
    void printBook( struct Books book )
    {
       printf( "Book title : %s
    ", book.title);
       printf( "Book author : %s
    ", book.author);
       printf( "Book subject : %s
    ", book.subject);
       printf( "Book book_id : %d
    ", book.book_id);
    }
    当上面的代码被编译和执行时,它会产生下列结果: Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id :
    6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700

    7,指向结构的指针

    struct Books *struct_pointer;

    通过&获取地址

    struct_pointer = &Book1;

    如果是采用指针,使用 -> 运算符得到成员

    struct_pointer->title;

    例子:

    #include <stdio.h>
    #include <string.h>
     
    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    };
     
    /* 函数声明 */
    void printBook( struct Books *book );
    int main( )
    {
       struct Books Book1;        /* 声明 Book1,类型为 Books */
       struct Books Book2;        /* 声明 Book2,类型为 Books */
     
       /* Book1 详述 */
       strcpy( Book1.title, "C Programming");
       strcpy( Book1.author, "Nuha Ali"); 
       strcpy( Book1.subject, "C Programming Tutorial");
       Book1.book_id = 6495407;
     
       /* Book2 详述 */
       strcpy( Book2.title, "Telecom Billing");
       strcpy( Book2.author, "Zara Ali");
       strcpy( Book2.subject, "Telecom Billing Tutorial");
       Book2.book_id = 6495700;
     
       /* 通过传 Book1 的地址来输出 Book1 信息 */
       printBook( &Book1 );
     
       /* 通过传 Book2 的地址来输出 Book2 信息 */
       printBook( &Book2 );
     
       return 0;
    }
    void printBook( struct Books *book )
    {
       printf( "Book title : %s
    ", book->title);
       printf( "Book author : %s
    ", book->author);
       printf( "Book subject : %s
    ", book->subject);
       printf( "Book book_id : %d
    ", book->book_id);
    }
    
    当上面的代码被编译和执行时,它会产生下列结果:
    Book title : C Programming
    Book author : Nuha Ali
    Book subject : C Programming Tutorial
    Book book_id : 6495407
    Book title : Telecom Billing
    Book author : Zara Ali
    Book subject : Telecom Billing Tutorial
    Book book_id : 6495700
  • 相关阅读:
    gitlab 升级
    通过 备份文件 恢复/迁移 gitlab
    gitlab 远程 定时备份
    PHP 中替换若干字符串字串为数组中的值,不用循环,非常高效
    php 在客户端生成txt文件并且下载
    Mysql时间戳函数
    mysql中在表中insert数据时,有重复主键id时,变成update
    css中解决img在a元素中使得a元素撑大写法
    php以excel的形式将数据输出
    css中常用的hack
  • 原文地址:https://www.cnblogs.com/straybirds/p/14782362.html
Copyright © 2020-2023  润新知