在类的结构分析中,用到了内存偏移,在这里补充一下
普通指针
定义一段代码
int a = 5;
int b = 5;
NSLog(@"%d,%p",a,&a);
NSLog(@"%d,%p",b,&b);
输出为:
![](https://img.haomeiwen.com/i1705709/81b586feecc5b14f.png)
a和b的值都是5,但是a的地址与b的地址不同,它们在内存中这样分布:
![](https://img.haomeiwen.com/i1705709/0ff1f86b6895dc30.jpg)
在内存的一篇区域中,存着一个数值5,这个5可以被所有的对象指向,当创建一个a变量,可以把a指向5,同理b也一样,但是在开发过程中改变其中一个变量的值另一个变量不会改变,这就是值拷贝
。
- a与b的地址相差4个字节,这取决于a与b的数据类型,int的占用内存为4字节.
- b的内存地址比a小,因为栈区是后进先出原则。
堆和栈
栈(stack)为自动分配的内存空间,它由系统自动释放;
堆(heap)则是动态分配的内存,大小不定也不会自动释放。
二级指针-指针的指针
从图中看,5是a的值,那一串16进制表示的是a和b的地址,通过取地址符&得到,定义一个实例对象也是如此,既包括被p指向
的内存,也有指向p
的指针。
![](https://img.haomeiwen.com/i1705709/c80e684036fbcde3.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]);
}
}
看结果:
![](https://img.haomeiwen.com/i1705709/86f25c1e9a876748.png)
总结
- &c与&c[0]都是取首地址,数组名为首地址
-
可以通过首地址加偏移量拿到数组中所有值,其中偏移量是数组的下标,内存中移动的字节为,偏移量*数据类型的字节数。
总结
网友评论