• 结构体详解


    结构体基本用法:

      结构体就是把相同或者不同类型的便利放到一起,这和C++中的类很像,但没有c++那么复杂,C语言中的结构体申明如下:

    struct student           //结构体名
    {
        char   name[10];     //姓名
        int    number;       //编号
        int    grade;        //成绩
    };

    申明很简单,其内存是按顺序放置的。

    下面需要注意的几点:

    1.申明时不能初始化(为什么后面会讲)

    2.申明只是申明一个结构体,是不能使用的

    3.获取结构体大小可以用sizeof(struct student)

    4.结构体可以嵌套定义

    5.结构体大小必须是所有成员变量大小的整数倍

    一般我们会使用新定义类型来代替结构体,其实就是给结构体起一个新的名字

    typedef  struct student
    {
         char     name[10];
         int      number;
         int      grade;
    }STU;
    
    STU stu1={"张三",001,95};//定义一个stu1结构体变量,并进行初始化
    注意:只有在定义的时候才能一起初始化,一旦定义了之后,不能一起初始化,但是可以分别初始化,为啥之后不能初始化,主要原因是因为结构体变量是按顺序存储的。

    这样STU表示的实际就是结构体,具体可以参考typedef用法。

    结构体既然申明了那怎么使用了,这里我们必须定义一个结构体变量,注意是结构体变量,也就是定义一个变量,这里的变量的类型是结构体,因此结构体申明部分其实就是申明一个新的变量类型,因此结构体是一个类型,不是变量,所以这也就是为啥申明的时候里面不能进行初始化的原因。下面举个例子来使用结构体:

    我们引用结构体是可以这样引用:
    stu1.name="李四";
    stu1.number=002;
    stu1.grade=100;
    上面的引用方式是成员引用,也就是普通变量方式引用,还有一种引用就是结构体指针引用,这两种引用的方式有很大不同,后面会讲到。
    指针引用时必须申明一个结构体指针,就像在整型变量中使用指针一样,我们需要先定义一个整型指针变量,然后使用它,这里也是一样。
    STU  *stu2;   //定义一个stu2结构体指针变量

    上面不能进行初始化,因为其实质是一个指针,不能像变量一样可以一起初始化(当然,指针实质还是变量,但是其使用不一样,所以一般说指针还是指指针变量)

    既然是指针,那么必须指向一个内存地址,因此指针变量使用之前必须指向一块特定的内存地址,结构体指针也不例外。那我们怎样初始化结构体指针呢

    第一种方式用动态分配内存的方式:

    stu2=(STU*)malloc(STU);

    第二种方式使用结构体变量间接方式:

    stu2=&stu1;

    这样结构体stu2指向的就是stu1的首地址。

    结构体高级用法:

      在函数中,如果参数是结构体,那么又该怎样使用呢,其实我们使用结构体和使用变量是一样的,定义如下

    void swap(STU stu1,STU stu2)
    {
    int exchange=0;
    exchange = stu1.grade; stu1.grade
    =stu2.grade;
    stu2.grade=exchange;
    /****** ...... ******/ }

     这样就可以使用结构体变量了,但是请思考下面代码结果:

    STU stu3={"王五",003,80};
    swap(stu1,stu3);

     执行这个函数两个结构体中的grade会交换么?结果是不会。这里就和函数中讲解的是一样的,那么我们怎么才能将其交换呢,在普通函数中给的方法是使用指针,因此这里我们同样可以使用指针来操作,我们必须将函数的形参定义为结构体指针变量。如下:

    STU swap(STU *stu1,STU *stu2)
    {
        int exchange=0;
        exchange = stu1->grade;
        stu1->grade=stu2->grade;
        stu2->grade=exchange;
    
    }

    这样我们使用

    swap(&stu1,&stu3);

    就可以将其调换位置了

  • 相关阅读:
    luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值
    覆盖的面积 HDU
    Picture POJ
    Atlantis HDU
    Transformation HDU
    Tunnel Warfare HDU
    Agri-Net POJ
    Conscription POJ
    Brush (IV) LightOJ
    Throwing Dice LightOJ
  • 原文地址:https://www.cnblogs.com/listenscience/p/10740869.html
Copyright © 2020-2023  润新知