zoukankan      html  css  js  c++  java
  • 深入探索C语言之结构体(struct)

    结构(struct)就是一种把一些数据项组合在一起的数据结构,其他语言把它称做为记录(record)。语法为将需要组合的内容放在花括号中,前面加上一个关键字struct,如下:

    struct {内容...};

    1. 怎样定义结构体变量:

    举个具体的例子,如将在校学生的信息定义为一个结构体,信息内容包括学生的姓名(string)、学号(long)、年龄(int)等,就可以声明如下:

    结构体本质是一种数据类型,和C语言的内置内型(char,int,long ...)类似,我们可以用它来定义变量,如定义一个学生Jack就可以这样:

    如还要再定义一个学生Rose

    我们就发现每次定义一个这样的结构体变量非常麻烦,每次都要将结构体类型声明完整写一遍,于是就引进了在struct关键字后面加上“结构标签”,例如上面的结构体就可声明为:

    从此定义变量可以这样完成:

    struct stuInfo Jack;

    struct stuInfo Rose;

    如果你还嫌略为麻烦,C语言中还可以通过关键字typedef对类型重命名,这样我们可以将上面的结构体重新命一个名字,如叫sInfo

    typedef struct stuInfo sInfo;

    定义变量将变得异常简单:

    将上面几步融合一起,就是我们通常所使用的定义结构体变量的方法:

    先声明一个结构体:

    再定义变量:


    2. 结构体的对齐问题:

    先看一个例子:

    输出的结果为12 8,也许你比较奇怪了,两个结构体的内容完全相同,只不过位置有点不同,为什么它们所占的内存的大小就不一样呢这其中就涉及到结构体对齐的问题。下面是两个结构体元素在内存中分布示意图:

    -- -- -- --    -- -- -- --

    C1|  |  |                                      I       

    -- -- -- --               -- -- -- --    

        I                                       C1|C2|  |  

    -- -- -- --               -- -- -- --

    C2|  |  |                                   Foo2 

    -- -- -- --                      

             Foo1

    也许你会有疑问为什么不将foo1元素组织成下面这样:

    -- -- -- --   

    C1|      I               

    -- -- -- --           

      |C2|       |               

    -- -- -- --       

    如果此时要访问,给出i的地址,要通过两次访存,还要进行一定的运算才能准确地取到i的值。因此在组织结构体的数据时,都会遵守对齐的原则:元素从其类型大小的整数倍的地址位置开始存放。这样就解释了上述foo1的大小为12的原因了。

    这也告诉我们,以后写结构体时,尽量将同类型的数据放在一起,这样会节省内存分配的空间。


    未完待续......

  • 相关阅读:
    用rpm安装软件的常用步骤
    将应用发布到WasLiberty的两种方法
    安装 ibm-java-x86_64-sdk-6.0-9.3.x86_64.rpm 的三步骤
    人是科技的第一生产力。不重视人的价值,不尊重人的需求,不解放人的生产力,必将被互联网时代快速淘汰。
    Java保存简单偏好的类
    实用快捷键Win+L=锁屏
    判断一件事有无技术含量的标准
    主动去平事 别等事找人
    看了某些蛊惑人心的招聘广告,实在忍不住想要提醒那些跃跃欲奉献的后生们
    ubuntu16.04在英文状态下安装中文语言包的过程(法二:命令行的方式)
  • 原文地址:https://www.cnblogs.com/hazir/p/2447274.html
Copyright © 2011-2022 走看看