內(nèi)存偏移

類的結(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é)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 引言 本文主要講述內(nèi)存里,指針的指向與取值,是一篇補充內(nèi)容 指針 指針的具體概述以及用法,此處不再細訴,請各位看官...
    Mr_wick閱讀 1,006評論 3 20
  • 變量的指針與內(nèi)存關(guān)系 局部變量是由系統(tǒng)分配在棧區(qū)的,而棧區(qū)的內(nèi)存是連續(xù)的。 定義兩個局部變量,看一看他們的地址有什...
    誓言_cf35閱讀 594評論 0 0
  • 指針偏移 普通內(nèi)存讀取 分析: a和b的值都指向了10 ,但是地址不一樣,屬于值拷貝 a和b的地址之間相差4個字節(jié)...
    猿人閱讀 748評論 0 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,434評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,569評論 0 4

友情鏈接更多精彩內(nèi)容