• C语言第九讲,结构体


                        C语言第九讲,结构体

    一丶结构体的定义

    在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

    struct 结构体名{
        结构体所包含的变量或数组
    };

    结构体是一种不同数据类型的集合.可以包含不同数据.用来表示不同的方法.

    例如:

      

    struct stu
    {
        TCHAR *Name;
        int nId;
        ....      
    }

    结构体是一种复合类型,为什么这么说.因为结构体是程序员来进行定义以及编写的.

    结构体的构成则是基本数据类型进行构成的.基本数据类型(char short int ...)是不可以在进行拆分了.

    而结构体可以进行拆分.

    二丶结构体变量

    结构体虽然是程序员定义的.但是我们要使用.所以可以进行定义变量来使用

    1.结构体定义

    语法:

      

    关键字 结构体定义名字 变量;
    struct stu st1;

    则st1就是结构体变量.

    2.结构体变量初始化

    结构体变量初始化有几种常用方式.

    1.定义的时候初始化
        struct stu
        {
           ...
        } st1,st2;
    声明了st1,st2变量
    2.大括号初始化
        
       struct stu st1 = {..,..};
    3.单个成员赋值.
        st1.name = xxx.
    4.同结构体变量可以给同结构体变量赋值.
        st1 = st2;

    3.结构体的访问:

     

        变量.类型名
        st1.name = "张三"

    三丶结构体数组

    1.结构体数组的定义

    结构体数组,顾名思义.如果我们想使用多个这种变量.总不能定义多次的变量吧.那么我们直接定义为一个数组即可.

    而这个就叫做结构体数组.

    语法;

      

    关键字  结构体名字
    {
       ....  
    }st1[5];
    st1是结构体数组的首地址,表明了数组有5个st1一样的结构体.

    当然,上面使用的是定义初始化.那么我们还可以使用变量直接定义进行定义数组.

    struct stu st1[5];

    2.结构体数组的初始化

    结构体数组的初始化可以进行大括号初始化.

    例如:

      

    struct stu
    {
    ..
    }st1[5] = {
                        {xxx,xxx},
                        {xxx,xxx},
                        {xxx,xxx},
                        {xxx,xxx},
                        {xxx,xxx}
                      };
    想象成定义了五组,那么我对每一组进行初始化即可.

    四丶结构体指针

    1.定义

    我们知道,C语言的灵魂就是指针.指针可以做的事情很多.

    那么结构体和指针也很常用.

    语法:

      

    struct stu  st1;
    struct stu *pSt1 =&st1;
    则pst1保存了st1的首地址.
    我们进行访问
        pst1->name = xxx;

    注意的问题:

      数组和指针组合的时候. 我们的 数组名字可以当做数组指针给指针赋值.

    例如:

      

    int a[5];
    
    int *p = a;

    不用加取地址符号,但是结构体变量不能这样.你想赋值给指针.那么比如加上取地址符号(&)

    例如:

      

    struct stu *pst1 = &st1

    2.访问

    访问的时候我们的语法:

      

    (*结构体指针).成员名字.
    例如:
        (*pstu1).name = xxx;
    或者
        pstu1->name = xxx;

    五丶结构体指针作为函数参数问题

    1.了解传值,传址的区别.

    我们知道,一个结构体的成员可能有很多.当我们定义结构体的时候,其实底层会根据我们的结构体成员.

    算出对齐值,然后进行申请内存.

    当我们作为函数参数的时候,如果直接传结构体变量.那么我们的函数参数.相当于拷贝了一份.

    这样特别消耗内存.

    例如:

      

    void ChangeValue(struct stu st1)//这里的st1是形参,如果传值,相当于新申请的变量
    {
       st1.name  = xxx;  
    }
    
    int main()
    {
       struct stu st1;
       st1.name = yyy;
       ChangeValue(st1);
      
    }

    上面的代码,我们在main中修改名字为yyy,当传入st1给函数的时候,其实 函数的st1相当于新申请

    的变量.拷贝了我们的实际参数(main中传参位置的st1叫做实际参数),我们在函数内部改为xxx

    其实不会改变实际参数的值,也就是说实际参数还是yyy

    只不过传值的时候,形参相当于拷贝了一份而已.

     

    2.传地址.

    如果我们想改变实际参数的值,那么把地址传过去就可以了.我们要知道,指针(地址)就是4个字节.

    所以我们拷贝过的是地址,根据地址修改里面的值,则可以进行修改.这个就是传址

    例如:

      

    void ChangeValue(struct stu *pst1)//这里的st1是形参,如果传值,相当于新申请的变量
    {
       pst1->name  = xxx;  
    }
    
    int main()
    {
       struct stu st1;
       st1.name = yyy;
       ChangeValue(&st1);
      
    }

    这样修改完之后,实际参数的值是YYY

     

      

  • 相关阅读:
    JS判断对象中是否存在某参数
    JS通过url下载文件
    .NET CORE LinQ查询中计算时间差
    C# 判断某个时间是星期几
    C#数组去重
    python Tank
    kubeflannel.yml Tank
    片言只语 Tank
    other Tank
    ERROR大集合 Tank
  • 原文地址:https://www.cnblogs.com/iBinary/p/9051745.html
Copyright © 2020-2023  润新知