美文网首页
内存偏移

内存偏移

作者: 杨奇 | 来源:发表于2021-07-12 22:00 被阅读0次

类的结构分析中,用到了内存偏移,在这里补充一下

普通指针

定义一段代码

 int a = 5;
 int b = 5;
 NSLog(@"%d,%p",a,&a);
 NSLog(@"%d,%p",b,&b);

输出为:


输出
a和b的值都是5,但是a的地址与b的地址不同,它们在内存中这样分布: 内存分布

在内存的一篇区域中,存着一个数值5,这个5可以被所有的对象指向,当创建一个a变量,可以把a指向5,同理b也一样,但是在开发过程中改变其中一个变量的值另一个变量不会改变,这就是值拷贝

  • a与b的地址相差4个字节,这取决于a与b的数据类型,int的占用内存为4字节.
  • b的内存地址比a小,因为栈区是后进先出原则。
堆和栈

栈(stack)为自动分配的内存空间,它由系统自动释放;
堆(heap)则是动态分配的内存,大小不定也不会自动释放。

二级指针-指针的指针

从图中看,5是a的值,那一串16进制表示的是a和b的地址,通过取地址符&得到,定义一个实例对象也是如此,既包括被p指向的内存,也有指向p的指针。

内存图.jpg
数组指针
int c[4] = {5,6,7,8};
        int *d   = c;
        NSLog(@"%p--%p--%p--%p",c,&c[0],&c[1],&c[2]);
        NSLog(@"%p--%p--%p--%p",d,d + 0,d + 1,d + 2);
        for (int i = 0; i < 4; i ++) {
            int value = * (d + i);
            NSLog(@"%d--%d---%p",c[i],value,&c[i]);
        }
    }

看结果: 截屏2021-07-12 21.39.46.png

总结

  • &c与&c[0]都是取首地址,数组名为首地址
  • 可以通过首地址加偏移量拿到数组中所有值,其中偏移量是数组的下标,内存中移动的字节为,偏移量*数据类型的字节数。


    总结

相关文章

  • 内存偏移

    在类的结构分析[https://www.jianshu.com/p/3e97c018df4c]中,用到了内存偏移,...

  • 汇编语言学习笔记(七)ds 寄存器

    一、访问内存中的数据 内存地址的表示方式 方式1, 段地址(ds):[偏移地址] 方式2,[偏移地址], 这种写法...

  • 006--iOS底层 - 类的结构(属性、成员变量、方法的探索)

    引言 上一篇讲到了内存偏移的知识和操作,接下来内存偏移将在本文用到具体的示例。我们对对象的探究已经了解了对象的底层...

  • ULK3 based on kenerl 2.6.11 读书笔

    第二章 内存寻址 内存地址 内存地址分为三种:逻辑地址(logical address)(段+偏移量) ...

  • ZipList

    占用连续内存的双向链表。节省内存,只能顺序查找。zlbytes 内存占用zltail 到列表尾部的偏移:可直接找到...

  • AtomicInteger原理,CAS 机制,乐观锁,ABA问题

    示例 从静态代码块可以看到,在类初始化的时候拿到值的偏移量(获取偏移量后直接操作内存,从内存取值,不通过缓冲区)。...

  • 汇编每天1分钟 (5) | 寄存器 CS、IP

    我们前面讲到内存地址是由段地址+偏移地址组成,例如:073F:0100。 接下来我们通过debug工具来检测,内存...

  • 数组

    从数字的内存存储模型来看,下标最确切的定义是偏移(offset) a[k] = base_address + k*...

  • C语言中内存对其规则

    C语言中结构体内存对齐规则 对齐规则: 内存偏移为该数据类型的最小整数倍 总体占用内存为结构体中最大数据类型的整数...

  • 类结构探索之-内存偏移

    变量的指针与内存关系 局部变量是由系统分配在栈区的,而栈区的内存是连续的。 定义两个局部变量,看一看他们的地址有什...

网友评论

      本文标题:内存偏移

      本文链接:https://www.haomeiwen.com/subject/ycjlyktx.html