内存偏移

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

普通指针

定义一段代码

 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]都是取首地址,数组名为首地址
  • 可以通过首地址加偏移量拿到数组中所有值,其中偏移量是数组的下标,内存中移动的字节为,偏移量*数据类型的字节数。


    总结
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 本文主要讲述内存里,指针的指向与取值,是一篇补充内容 指针 指针的具体概述以及用法,此处不再细诉,请各位看官...
    Mr_wick阅读 903评论 3 20
  • 变量的指针与内存关系 局部变量是由系统分配在栈区的,而栈区的内存是连续的。 定义两个局部变量,看一看他们的地址有什...
    誓言_cf35阅读 547评论 0 0
  • 指针偏移 普通内存读取 分析: a和b的值都指向了10 ,但是地址不一样,属于值拷贝 a和b的地址之间相差4个字节...
    猿人阅读 582评论 0 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,190评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,122评论 0 4