文档章节

第09天C语言(12):结构体-在内存中的存储细节

lyh2017iOS
 lyh2017iOS
发布于 2017/07/06 01:26
字数 895
阅读 1
收藏 0

#pragma mark 结构体-在内存中的存储细节 ###pragma mark 概念

###pragma mark 代码

#include <stdio.h>
int main()
{
    
#warning 数组的存储细节 -- 查看function
    /*
    // 1. 内存寻址 从大到小
    // 2. 存储数组元素 从小到大
    // 3. 数组的地址 就是 数组首元素的地址
    int nums[3] = {1,3,5};
    
#warning 结构体的存储细节 -- 查看function1
    // 注意 : 定义结构体类型并不会分配存储空间
    // 只有定义结构体变量 才会真正的分配存储空间
    struct Person
    {
        int age;    // 4
        int height; // 4
        int width;  // 4
    };
    struct Person sp;
    // 从当前来看, 结构体变量所占用的存储空间就是它所有属性所占用存储空间的总和
    printf("size = %lu\n",sizeof(sp));
    
    printf("&age = %p\n",&sp.age);
    printf("&height = %p\n",&sp.height);
    printf("&width = %p\n",&sp.width);

    // 结构体名称并不是结构体的地址
//    printf("&sp = %p\n",sp);
    // 结构体的地址就是他第9个属性的地址
    printf("\n&sp = %p\n",&sp);
    printf("&age = %p\n",&sp.age);
     */
    
#warning 结构体是如何分配存储空间 查看function2
    // 结构体会首先找到所有属性中 占用内存空间最大的那个属性,然后按照该属性的 倍数类 分配存储空间
    
    // 1. 找到结构体类型占用存储空间最大的属性,以后就按照该属性占用的存储空间分配(在当前这种情况 每次分配8个字节)
    // 2. 会从第0个属性开始分配存储, 如果存储空间 不够就会 重新分配, 如果存储空间还有剩余, 那么就会把后面的属性的数据 存储 剩余的存储空间中
    /*
    struct Person
    {
        double height;      // 8
        int age;            // 4
        char c;             // 1
    };
    struct Person sp;
     */
    
    // 3. 会从第0个属性开始分配存储, 如果存储空间 不够就会 重新分配, 并且会将当前属性的值 直接存储到新分配的存储空间中, 以前剩余的存储空间就不要了
    struct Person
    {
        int age;            // 4
        double height;      // 8
        char c;             // 1
    };
    struct Person sp;
    
    printf("size = %lu\n",sizeof(sp));
    // 注意 : 为什么要按照所有属性中占用存储空间最大的属性的字节 来分配存储空间呢?
    // 主要是为了提高计算机的运输速度
    
    return 0;
}


void function()
{
    // 内存寻址从大到小 最先开始初始化的时候 是放在最上面
    /*
     地址     变量         内容
     offc1
     offc2
     
     offc3   nums       nums[0]     // 数组的地址
     offc4   nums       nums[0]
     offc5   nums       nums[0]
     offc6   nums       nums[0]
     
     offc7   nums       nums[1]
     offc8   nums       nums[1]
     offc9   nums       nums[1]
    offc10   nums       nums[1]
     
    offc11   nums       nums[2]
    offc12   nums       nums[2]
    offc13   nums       nums[2]
    offc14   nums       nums[2]

     */
}

void function1()
{
    /*
     地址     变量         内容
     offc1
     offc2
     
     offc3   sp       age     // 年龄的地址
     offc4   sp       age
     offc5   sp       age
     offc6   sp       age
     
     offc7   sp       height  // 高度的地址
     offc8   sp       height
     offc9   sp       height
    offc10   sp      height
     
    offc11   sp       width   // 宽度的地址
    offc12   sp       width
    offc13   sp       width
    offc14   sp       width
     
     */
}

void function2()
{
#warning 分配1
    /*
     地址     变量         内容
     offc1
     offc2
     
     offc3   sp       height     // 高度的地址
     offc4   sp       height
     offc5   sp       height
     offc6   sp       height
     offc7   sp       height
     offc8   sp       height
     offc9   sp       height
    offc10   sp       height
     
    offc11   sp       age   // 年龄的地址
    offc12   sp       age
    offc13   sp       age
    offc14   sp       age
    offc15   sp       c   // 姓名的地址
    offc16   sp
    offc17   sp
    offc18   sp
     
     */
#warning 分配2
    /*
     地址     变量         内容
     offc1
     offc2
     
     offc3   sp       age      // 年龄的地址
     offc4   sp       age
     offc5   sp       age
     offc6   sp       age
     offc7   sp
     offc8   sp
     offc9   sp
     offc10   sp
     
     offc11   sp       height   // 高度的地址
     offc12   sp       height
     offc13   sp       height
     offc14   sp       height
     offc15   sp       height
     offc16   sp       height
     offc17   sp       height
     offc18   sp       height
     
     offc11   sp       c   // 姓名的地址
     offc12   sp
     offc13   sp
     offc14   sp
     offc15   sp
     offc16   sp
     offc17   sp
     offc18   sp
     
     */
    
}

© 著作权归作者所有

共有 人打赏支持
lyh2017iOS
粉丝 1
博文 357
码字总数 137380
作品 0
朝阳
私信 提问
C语言系列(六)结构体和联合体

转载自:https://blog.csdn.net/u011974987/article/details/52305364 结构体 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: 1 2 3 结构体是一种集合...

fybon
06/20
0
0
二十一、结构体

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 C语言的核心部分都...

长平狐
2013/03/28
276
0
C语言基础-13-结构体

C语言的核心部分都说得七七八八了,相信大家已经对C语言的基本数据类型(charintfloat)、数组、指针都很熟悉了,今天来学习C语言中另外一种数据类型:结构体。在iOS开发中,结构体是经常用到的...

Corwien
2016/03/16
10
0
深入理解C语言结构体成员变量内存分配

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。 1 问题描述 在学习C语言的时候,我们都会频繁的接触到结构体,使用结...

算法与编程之美
04/05
0
0
[iOS]C语言知识点系列视频整理

C语言知识点系列视频 目录 C语言技术视频-01-变量的定义 C语言技术视频-02-程序分支结构(if...else) C语言技术视频-03-程序分支结构(switch) C语言技术视频-04-程序循环结构(while{}) C语言技...

浩浩老师
2015/10/13
38
0

没有更多内容

加载失败,请刷新页面

加载更多

2018最新Web前端经典面试试题及答案

javascript: JavaScript中如何检测一个变量是一个String类型?请写出函数实现 typeof(obj) === "string" typeof obj === "string" obj.constructor === String 请用js去除字符串空格? 方法一...

Jack088
5分钟前
0
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
11分钟前
0
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
11分钟前
1
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
29分钟前
5
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
41分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部