在類的結(jié)構(gòu)分析中,用到了內(nèi)存偏移,在這里補充一下
普通指針
定義一段代碼
int a = 5;
int b = 5;
NSLog(@"%d,%p",a,&a);
NSLog(@"%d,%p",b,&b);
輸出為:

輸出
a和b的值都是5,但是a的地址與b的地址不同,它們在內(nèi)存中這樣分布:

內(nèi)存分布
在內(nèi)存的一篇區(qū)域中,存著一個數(shù)值5,這個5可以被所有的對象指向,當(dāng)創(chuàng)建一個a變量,可以把a指向5,同理b也一樣,但是在開發(fā)過程中改變其中一個變量的值另一個變量不會改變,這就是值拷貝。
- a與b的地址相差4個字節(jié),這取決于a與b的數(shù)據(jù)類型,int的占用內(nèi)存為4字節(jié).
- b的內(nèi)存地址比a小,因為棧區(qū)是后進先出原則。
堆和棧
棧(stack)為自動分配的內(nèi)存空間,它由系統(tǒng)自動釋放;
堆(heap)則是動態(tài)分配的內(nèi)存,大小不定也不會自動釋放。
二級指針-指針的指針
從圖中看,5是a的值,那一串16進制表示的是a和b的地址,通過取地址符&得到,定義一個實例對象也是如此,既包括被p指向的內(nèi)存,也有指向p的指針。

內(nèi)存圖.jpg
數(shù)組指針
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]);
}
}
看結(jié)果: 
截屏2021-07-12 21.39.46.png
總結(jié)
- &c與&c[0]都是取首地址,數(shù)組名為首地址
-
可以通過首地址加偏移量拿到數(shù)組中所有值,其中偏移量是數(shù)組的下標(biāo),內(nèi)存中移動的字節(jié)為,偏移量*數(shù)據(jù)類型的字節(jié)數(shù)。
總結(jié)
