内存偏移

2021-07-12  本文已影响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也一样,但是在开发过程中改变其中一个变量的值另一个变量不会改变,这就是值拷贝

堆和栈

栈(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

总结

上一篇 下一篇

猜你喜欢

热点阅读