• C语言中,能和指针并排核心知识的结构体,该如何掌握?


    C语言可谓是编程界的传奇语言,历经几十年,依然排名前列。

    本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构。

    一、关于结构体

    在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。

    结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

    结构体的定义如下所示:

    struct tag { member-list } variable-list;

    其中:

        ✿ struct为结构体关键字;

        ✿ tag为结构体的标志;

        ✿ member-list为结构体成员列表,其必须列出其所有成员;

        ✿ variable-list为此结构体声明的变量。

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


     

    二、结构体常规定义

    不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。

    方法1:

    定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.

    struct stu

    {

        char  aa;

        short bb;

        int  cc;

    };

    struct stu stu1, stu2;

    方法2:

    定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.

    struct stu

    {

        char  aa;

        short bb;

        int  cc;

    }stu1, stu2;

    struct stu stu3;

    方法3:

    定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。

    struct

    {

        char  aa;

        short bb;

        int  cc;

    }stu1, stu2;

    提示:

    这里不能像上面再定义结构体变量:(以下错误)

    struct stu3;

    struct stu stu3;


     

    三、使用typedef定义结构体

    这里先简单说下typedef.

    在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。

    方法4:

    使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。

    typedef struct stu

    {

        char  aa;

        short bb;

        int  cc;

    }STU;

    STU stu1;

    你会发现,其实就是通过关键字typedef,将STU取代了struct stu。

    当然,也可以这么用:

    struct stu stu1;

    上面这种定义就失去了typedef的意思,所以不推荐。

    方法5:

    使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。

    typedef struct

    {

        char  aa;

        short bb;

        int  cc;

    }STU;

    STU stu1;

    方法6:

    还有一种符合语法规则,但意义不大的定义方式。

    typedef struct stu

    {

        char  aa;

        short bb;

        int  cc;

    };

    struct stu stu1;

    以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。


     

    四、结构体大小计算

    结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。

    1.对比两结构体大小,一样吗?

    结构体1:

    struct stu

    {

        char  aa;

        short bb;

        char  cc;

    }stu1;

    结构体2:

    struct stu

    {

        char  aa;

        char  bb;

        short cc;

    }stu2;

    答案是不一样。程序测试得出sizeof(stu1)=6, sizeof(stu2)=4.

    2.分析不一样原因

    结构体计算要遵循字节对齐原则,一般满足三个准则:

    1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

    2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

    3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节;

    对于上面结构体stu1来说,最大字节:2字节,顺序是 char-short-char:

    2个字节


     

    对于上面结构体stu2来说,最大字节:2字节,顺序是 char->char->short:


     

    通过上面两个表格,相信你应该明白了,改成4字节的int,原理一样。

    最后,强调一下,学习编程,不能只看书,要多敲代码。


     

    如果你想深度学习C语言以及高级编程——编程俱乐部【点击进入】!

    涉及到:C语言、C++、windows编程、网络编程、QT界面开发、Linux编程、游戏编程、黑客等等......


     

    程序员编程入门资料:


     

    程序员​推荐学习书籍:


     

    一个活跃、高逼格、高层次的程序员编程学习殿堂;编程入门只是顺带,思维的提高才有价值!

  • 相关阅读:
    html5 laboratory
    Lind.DDD.LindAspects方法拦截的介绍
    MongoDB学习笔记~对集合属性的操作
    MongoDB学习笔记~数据模型属性为集合时应该为它初始化
    异步与并行~List<T>是线程安全的吗?
    基础才是重中之重~Emit动态构建方法(参数和返回值)
    XML和DTD的简单介绍和入门
    一些常用的Intent及intent-filter的信息
    最新县及县以上行政区划代码(截止2013年1月18日) 全国省市县数据库 之省市数据
    CRC32 vs Java.HashCode
  • 原文地址:https://www.cnblogs.com/huya-edu/p/13891032.html
Copyright © 2020-2023  润新知