亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        c/c++深入探討數(shù)組內(nèi)存模型

        字號(hào):

        對(duì)于一個(gè)好學(xué)的人來(lái)書(shū),怎么做不重要,關(guān)鍵是為什么要這樣做,只有深入到這一步了,才敢說(shuō)‘阿,我懂了’,于是,以后碰到類(lèi)似的問(wèn)題,就可以從我們知道的原理出發(fā),悠然自得而又滿(mǎn)懷信心地推導(dǎo)出正確的結(jié)果。然而,好學(xué)的人往往注定了困惑于一時(shí)的不解,并且,付出過(guò)多的時(shí)間去試圖解決這種迷惑不解,其中的辛苦是可想而知的,因?yàn)?,我就是這樣走過(guò)來(lái)的。所以,一直都想寫(xiě)一個(gè)關(guān)于指針,數(shù)組,地址,左右值等等這些在語(yǔ)言的學(xué)習(xí)里面最讓人困惑不解的問(wèn)題。怎奈時(shí)間有限,一直沒(méi)有能完成這樣的想法,今天一樣是太忙,可能不能完整的把我想說(shuō)的寫(xiě)出來(lái)了,那么,就走個(gè)捷徑,拋開(kāi)c++/C的語(yǔ)義,從系統(tǒng)底層的原理來(lái)就事論事的解決一下網(wǎng)友的問(wèn)題,本人水平不高,全當(dāng)拋磚引玉。
            [注意,下面的講解全部以32位系統(tǒng)為例,也就是說(shuō),一個(gè)int占用4 bytes]
            的。
            比如:
            void main()
            {
            int a=0;
            int array[10];
            a=3;//ok
            array[0]=4;//ok
            array={1,2,4};//error
            printf("%d,%d,%d",a,array[0],array);//ok
            return;
            }
            對(duì)于上面的程序段,a代表了系統(tǒng)中一個(gè)4byte的內(nèi)存區(qū)域,編譯時(shí)候用a來(lái)代表內(nèi)存的值[也就是所謂右值],array來(lái)代表一段(4*10)byte內(nèi)存區(qū)域的值,而具體到array這個(gè)變量的身上,編譯器解釋他的時(shí)候,把它看成是這段內(nèi)存的首地址。所以上面的程序段中的那個(gè)printf打印出來(lái)的因該是'a的值, array第一個(gè)元素的值,array的首地址'?;谝陨系囊恍┦聦?shí)和理論,
            int *p=array;
            int **p1=&array;
            p和p1從他們的值上面來(lái)說(shuō),他們是一樣的,都是array元素的首地址,他們的不同在于他們的語(yǔ)義上的區(qū)別,
            *p=array;//一個(gè)指向了數(shù)組的指針
            int **p1=&array;//一個(gè)指向了‘指向數(shù)組的指針‘得指針。
            語(yǔ)義上的不同,對(duì)于編譯器來(lái)解釋這個(gè)變量的行為的時(shí)候非常重要,但是對(duì)于系統(tǒng)的內(nèi)部來(lái)說(shuō),基本的內(nèi)存的結(jié)構(gòu)一樣的,我們?nèi)绻茏プ∵@點(diǎn)的話(huà),那么,指針對(duì)我來(lái)說(shuō)將是透明的。
            下面舉個(gè)例子:
            int array[10];
            int array2d[3][10];
            這兩個(gè)數(shù)組的區(qū)別和聯(lián)系分別是什么,如果你能很清楚地認(rèn)識(shí)到那么,你已經(jīng)有不錯(cuò)的功力了。
            首先,不同點(diǎn),
            最表面的語(yǔ)義上的不同就是一個(gè)是1維,一個(gè)是二維,
            for(int i=0;i<10;i++)
            {
            for(int j=0;j<3;j++)
            {
            array2d[j][i]=array[i];
            }
            }
            上面的程序?qū)⒂?行數(shù)據(jù)的array2d數(shù)組每行都設(shè)成和array相同的值,從這一層來(lái)看,我們更能清晰地感覺(jué)到行和列的存在[也就是意識(shí)到了維的存在。
            但是在內(nèi)存內(nèi)部的實(shí)現(xiàn)又是什么樣的情況呢[注意,現(xiàn)在來(lái)說(shuō)相同點(diǎn)啦.