【待补】

· · 个人记录

初识struct

  1. 结构体是什么?

    结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。 \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad——百度百科

    接下来我们要说的结构体都是struct,而不是class
    我没用过class,也不知道struct和class的区别

  2. struct的声明

    struct 结构名称{
        //成员列表 
    }; //记得要加分号!!

    有个很常见的例子是这样的:
    有很多个同学,他们有学号、姓名、性别,那么如何把他们存起来?
    于是你就可以用个函数体把他们存起来,像这样:

    struct student{
        int num;
        char name[22];
        bool sex;
    };

    于是我们声明了一个结构体:
    它有一个int类型的学号,一个长为20的char数组类型的名字,还有一个bool值表示性别
    结构体内也可以有数组、指针
    结构体内还可以有其他结构体
    结构体内更可以有结构体本身!(但只能是指针
    相同类型的结构体是可以用 = 赋值的!!!

  3. struct的定义
    像之前我们已经声明了一个叫 struct student 的结构体,那它有什么用吗?
    好看
    当然是用来定义结构体啦
    定义有两种方法:

    //在声明同时定义
    struct student{
        int num;
        char name[22];
        bool sex;
    }Xiao Ming;
    //定义
    struct student stu[100];

    在C++中 可以直接用 结构名称+变量名 的形式定义

  4. 结构体成员的使用
    有两种方式
    结构体名.成员
    结构体名->成员

  5. struct的大小
    你需要先知道一点关于数据类型所占空间的芝士(略

    首先 struct自身是不占空间的
    然后 让我们来看看 sizeof(struct student) 是多少吧:

    【图片待补】

    ??28??
    应该是4+22*1+1=27啊
    下面来进行实验:
    一. 把char数组开到23 结果:28 ;
    二. 把char数组开到24 结果:32 ;
    三. 把数组开回22 再声明一个long long 结果:40 ;

    现实是这样的:struct要进行“对齐”处理
    不明白是吧? 让我来生动形象地解释一下

    我们设struct中单个数据类型占用的最大空间为x
    则struct的大小就是nx
    (n-1)x大小的空间装不下struct里的数据类型所占的空间

    例如struct里有个占空间很大的long long,结构体就会8个字节8个字节地开存储空间,直到把所有的成员都装下

让我们先引入一个例题

众所周知,C++中有许许多多的变量类型,但唯独没有分数
现在给你两个形如 \dfrac{a}{b} 的分数,让你输出它们加减乘除四则运算的结果
保证两分数的分子分母均不为 0
输出要求:如果是整数,则输出整数;如果分数是负数,符号和分子一起输出

先上两个式子:

\dfrac{a}{b} \pm \dfrac{c}{b}=\dfrac{a \pm c}{b}\qquad \dfrac{a}{b} \pm \dfrac{c}{d}=\dfrac{ad}{bd} \pm \dfrac{bc}{bd}=\dfrac{ad \pm bc}{bd} \qquad(b \ne d)

乘除法就不用说了吧...

明白了题目后,我们很快地就可以写出一个结构体

struct Fraction{
    int a,b;
};

接下来的大多知识,我们都会围绕着这个题来进行讲解

struct与函数

  1. 子函数里的struct
    函数里是可以传入结构体的,当然也可以返回结构体,更可以对结构体进行一些奇奇怪怪的处理
    下面举出三个例子:

    void reduction(Fraction &u){   //约分 
        if(u.b<0) u.b=-u.b,u.a=-u.a;
        int _a=abs(u.a);
        int k=gcd(_a,u.b);
        u.a/=k,u.b/=k;
    }
    Fraction add(Fraction &u,Fraction &v){
        Fraction f;
        if(u.b==v.b) f.a=u.a+v.a,f.b=u.b;
        else f.a=u.a*v.b+v.a*u.b,f.b=u.b*v.b;
        reduction(f);
        return f;
    }
    void print(Fraction &u){
        if(u.b==1) cout<<u.a;
        else cout<<u.a<<"/"<<u.b;
    }
  2. struct里定义函数