• 结构体 可以由多个不同类型的数据构成


    结构体:可以由多个不同类型的数据构成

    数组:只能存放一种数据类型

    1. 也是一种数据类型;构造类型;数组也是一种构造类型;
    2. 数组同时只能存放一种数据类型;
    3. 字符串存放的两种方法:字符串数组和指针数组;
    4. 结构体:可以由多个不同类型的数据构成;
    5. 第一步定义结构体类型;第二步是根据结构体类类型,定义结构体变量;
    6. struct Person{ int age;double height;char *name;};定义了person结构体类型;里面的变量可以成员或属性;
    7. char *name;是指针变量存放地址;
    8. struct Person p;根据结构体类型,定义结构体变量;
    9. struct Person p={20,1.55,"jack"};
    10. p.age=30;代表给age赋值;有点面向对象的味道;
    11. 只能在定义结构体变量的同时给它赋值;因为结构体名是一个地址;不能随便改变结构体名的地址;如错误写法:struct Person p2;p2= {30,1.67,"jake"};正确写法:struct Person p2= {30,1.67,"jake"};也可以写成:struct Person p2= {.height=1.55,.age= 20,.name="jake"};

    结构体内存分析;从上往下分配;

    1. 定义结构体类型的时候没有定义变量,所以没有分配存储空间;如struct Date{int year;int month;int day;};这一句就没有分配存储空间;
    2. 结构体所占用的字节是结构体类型中成员的字节和;
    3. struct Date是一个结构体类型,还没有结构体变量;
    4. 查看字节的地址:printf("%p - %p - %p ",&d1.year,&d1.month,&d1.day);
    5. 结构体变量赋值给结构体变量,会将d1所有成员的值对应地赋值给d2的值;
    6. 补齐算法;(对齐算法)结构体占用的字节数必须是最大成员字节的倍数;
    7. struct Student{int age;char *name;};所以这个由16个字节;

    结构体注意点和其他用法:

    1. 定义结构体类型不分配存储空间;变量类型写左边;变量名写右边
    2. struct Student{int age;double height; char *name;}stu;这句代码写了两个意思;其中定义了结构体类型;还利用新定义好的类型来定义结构体变量;(定义类型的同时定义变量);这是定义变量的第二种方式;
    3. 结构体类型不能重复定义;
    4. 不写结构体类型名的方法;struct {int age;char *name;}stu;第三种方法;
    5. 三种定义结构体变量的方法:先定义类型,再定义变量;定义类型的同时定义变量;定义了类型的同时定义变量(省略了类型名称)
    6. 结构体类型有作用范围;程序员自定义的一般都有范围限制;
    7. 如果想写一个类型在任何地方都能用,那么需要把它在程序外面;
    8. 在全局可以定义一个结构体;在函数内部也可以重复定义一个结构体;

    结构体数组;

    1. 之前有指针数组;字符串数组;
    2. 类似积分排行榜;struct RankReord{int no;char *name;int score;}
    3. 结构体数组的类型写法:struct RankRecord records[3]={{1,"jack",5000},{2,"jim",500},{3,"jake",300}};
    4. 在使用for循环输出给用户看:for(int i = 0;i<3;i++){printf("%d %s %d ",records[i].no,recores[i].name,records[i].score);}
    结构体的嵌套
    1. 多次使用同一个结构体的时候使用;
    2. struct Date{int year;int month;int day;};     struct Student{int no;struct Date birthday;struct Date ruxueDate;}    struct Student stu={1,{200,9,10},{2012,9,10}};
    3. 输出:printf("year=%d,month=%d,day=%d ",stu.birthday.year,stu.birthday.month,stu.birthday.day);
    4. 指针变量指向结构体;struct Student *p;p=&stu;
    5. 用了指针之后,访问方式的变化;
    6. printf("age=%d,no=%d ",(*p).age,(*p).no);
    7. 第三种方式访问:printf("age=%d,no=%d ",p->.age,p->.no);
    8. ->是用在指针结构体身上的;->的作用是直接找到我们p指向的结构体;
    9. p->age =30;直接这样就可以修改值;
    10. 指向结构体的指针的定义;struct Student *p;
    11. 利用指针访问结构体的成员;(*p).成员名称;p->成员名称;
    12. 共用体

  • 相关阅读:
    桶排序
    Ultra-QuickSort
    Merge Sort
    Max Sum
    快排
    Oil Deposits
    1009: josephus问题
    A+B Again(在某个数中找大于m的最小约数)
    luogu4181 [USACO18JAN]Rental Service (贪心)
    luogu4185 [USACO18JAN]MooTube (并查集)
  • 原文地址:https://www.cnblogs.com/williamliuwen/p/5367538.html
Copyright © 2020-2023  润新知