zoukankan      html  css  js  c++  java
  • C语言基础:C语言结构体(2)

    上一节, 我们简单的介绍了结构体的一些知识点, 以及一些注意的事项, 这次我们来看看结构体是怎么样在内存存储的~


    我们来看一个小例子:

    #include <stdio.h>
    
    int main()
    {
        struct Date
        {
            int year;
            double dou;
            int month;
            int day;
        };
        
        struct Date D = {2014, 1.2, 9, 10};
        
        int c = sizeof(D);
        
        printf("size = %d
    ", c);
    
        return 0;
    }

    输出的结果;



    按照我们对类型来算, 3个int类型是12, 再加上一个double类型, 应该是20才对, 那为什么会24呢?


    其实啊, 在结构体里, 是按照最长的类型倍数来存储的, 而这4个类型里面最长的就是double, 所以是输出24, 看看下面的示意图吧;



    在结构体上, 这样子叫做对齐算法, 也可以成为补齐算法, 以最大的那个类型的倍数来存储, 不够存就添加都一个最长的, 哪怕是多余, 也不会理会~~


    下面还有一个例子:

    #include <stdio.h>
    
    int main()
    {
        struct Date
        {
            int year;
            int month;
            int day;
        };
    
        // 2.定义结构体变量(真正分配存储空间)
        struct Date d1 = {2011, 4, 10};
    
        struct Date d2 = {2012, 8, 9};
    
        // 会将d1所有成员的值对应地赋值给d2的所有成员
        d2 = d1;
    
        printf("d1 = %d - %d - %d
    ", d1.year, d1.month, d1.day);
        printf("d1的地址为:%p
    ", &d1);
    
        printf("d2 = %d - %d - %d
    ", d2.year, d2.month, d2.day);
        printf("d2的地址为:%p
    ", &d2);
    
        return 0;
    }
    

    输出的结果:



    虽然代码里d1把值都赋给了d2, 但是它们也是互不相关的, 它们两个是独立的两个整体, 在后面随意怎么修改它们任意一个的值, 另一个也不会因为这样子而改变里面的值.


    好了, 这次我们就讲到这里, 下次我们继续~~~

  • 相关阅读:
    (转)Scrapy 深入一点点
    解决Scrapy shell启动出现UnicodeEncodeError问题
    js回调方法
    UGUI 之 控件以及按钮的监听事件系统 存档
    重力感应示例
    网格概念
    Flash Player11异步解码Bitmap
    打包包含已修改过的bug
    ios7官方推荐icon尺寸
    项目资源通过swc获取
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282885.html
Copyright © 2011-2022 走看看