女人夜夜春高潮爽A∨片传媒_国产精品VIDEOS麻豆_在线精品亚洲一区二区三区_亚洲熟妇无码av

編程代碼
新聞詳情

「C++」讀懂指針與內存

發(fa)布時間(jian):2021-01-18 09:08:08 瀏覽次數(shu):3098

C和C++最強大的地方在哪(na)(na)里(li)呢?就是指(zhi)針對(dui)內(nei)存(cun)的操作。有了指(zhi)針我(wo)們才可以在代(dai)碼(ma)內(nei)存(cun)里(li)自由飛(fei)翔,想(xiang)玩(wan)哪(na)(na)里(li)玩(wan)哪(na)(na)里(li),想(xiang)變什么變什么。


內存
首先我們聊聊什么是內存(我們以32位程序模型為例)。對于一個進程來說,內存可以理解成一連串的帶編號的存儲區域。

每個進程都映(ying)射一段連(lian)續的虛擬內(nei)存地(di)址(zhi)(不(bu)是內(nei)存的真實物理地(di)址(zhi),只是一個編號,物理內(nei)存地(di)址(zhi)可以不(bu)連(lian)續)。

「C++」讀懂指針與內存

每個格子我(wo)們(men)理解為一個字節,也就是一個byte或者說一個unsigned char。


而指針(zhen)其實就(jiu)(jiu)是(shi)(shi)一個數字,記(ji)錄的(de)(de)就(jiu)(jiu)是(shi)(shi)內(nei)存的(de)(de)地址,也就(jiu)(jiu)是(shi)(shi)我們標(biao)記(ji)的(de)(de)每個小格子的(de)(de)數字編號。

在(zai)32位系統(tong)的時(shi)候,指針占(zhan)4個(ge)字(zi)節,能表示的數字(zi)最大值是4294967295。

(64位程序(xu)指針占8個字(zi)節,所以能(neng)使用的內存空間就很大)

「C++」讀懂指針與內存

「C++」讀懂指針與內存

將4294967295個(ge)(ge)字節轉(zhuan)換G單(dan)位(wei)大概就(jiu)是(shi)4G。所以(yi)32位(wei)程(cheng)序能(neng)用的最大內存(cun)空(kong)(kong)間(jian)就(jiu)是(shi)4G。其中0到(dao)3G是(shi)用戶空(kong)(kong)間(jian),3G到(dao)4G是(shi)內核空(kong)(kong)間(jian),我們在實際使(shi)用32位(wei)程(cheng)序時候,大概也就(jiu)能(neng)操作到(dao)1.7G左右的內存(cun),超過這個(ge)(ge)量再分配內存(cun)基(ji)本上程(cheng)序就(jiu)崩(beng)潰了。


程序的內存區域大概分了如圖六塊,其中堆和(he)棧是根據實際(ji)運行情況擴展使(shi)用內存區域。

「C++」讀懂指針與內存

來來來。。我們寫段代(dai)碼驗證下,都用int變量(liang),偏移(yi)量(liang)是(shi)4個字節,方(fang)便(bian)查看。

看看運行結果,內存地(di)址就是(shi)這樣按照區域分配的。

「C++」讀懂指針與內存

「C++」讀懂指針與內存

指針

明白了(le)內存,我們(men)就來玩玩指針,看他怎(zen)么個自由飛翔(xiang)。

先(xian)上一(yi)段樸實的代(dai)碼:

「C++」讀懂指針與內存

運行結果是這樣的:

「C++」讀懂指針與內存

讓我們(men)來分析下這段代碼(ma)吧。


為了方便使用(yong)結構(gou)體倒(dao)騰,我這(zhe)里都(dou)用(yong)的是4倍(bei)體的變量,而且把double放在了第(di)一個。關于(yu)結構(gou)體排列問題有機會我再寫(xie)寫(xie)。反(fan)正這(zhe)里呢,就按(an)照(zhao)這(zhe)幾(ji)個位置排列內存了。


首先我們整了(le)一個100字(zi)節(jie)(jie)的(de)內存,神馬(ma)都沒有,然(ran)(ran)后通過(guo)指針和偏移(yi)量,我們可(ke)(ke)以(yi)(yi)跳轉到內存任意(yi)位(wei)置(zhi),并(bing)且可(ke)(ke)以(yi)(yi)把那個位(wei)置(zhi)解釋成任意(yi)類型(xing)(xing)。所以(yi)(yi)指針可(ke)(ke)以(yi)(yi)是(shi)8字(zi)節(jie)(jie)的(de)double類型(xing)(xing),也可(ke)(ke)以(yi)(yi)是(shi)4字(zi)節(jie)(jie)的(de)int和float類型(xing)(xing),然(ran)(ran)后對該(gai)類型(xing)(xing)直接賦值。

最后,我們直接來個(ge)風騷操作,把這段內(nei)(nei)存(cun)強(qiang)制(zhi)當成結構(gou)(gou)體(ti)類型的(de)(de)指針,然后因為位置能對上,所以結構(gou)(gou)體(ti)內(nei)(nei)的(de)(de)成員變量就(jiu)都對應上了。


然(ran)后(hou)我們再(zai)來(lai)玩一玩快樂指針的游(you)戲(xi),依然(ran)使用剛才內存(cun)倒騰過的區域。

「C++」讀懂指針與內存

這里p指向了b變量的位置,此時我們可以(yi)把p當成(cheng)一個int數(shu)組,所(suo)以(yi)p[3]就是該數(shu)組第四(si)個元素,也就是變量e。

「C++」讀懂指針與內存

這里p+2表(biao)示(shi)按照指針類(lei)型移動2個(ge)(ge)(ge)位置,int是4個(ge)(ge)(ge)字(zi)節,所(suo)以內存上總(zong)共(gong)移動8個(ge)(ge)(ge)字(zi)節,到了d的位置,雖然位置對了,但(dan)是d不是一個(ge)(ge)(ge)int類(lei)型,按照int去解釋是錯誤的。所(suo)以我(wo)們把(ba)類(lei)型解釋成float。

「C++」讀懂指針與內存

當然因為float也是(shi)4個字節,所以我(wo)們(men)可以p[2]直接取(qu)到d位置的(de)值,此時這里是(shi)解釋出來的(de)int值是(shi)錯誤的(de),然后我(wo)們(men)取(qu)地(di)址變成指針,再(zai)強轉(zhuan)成float指針,再(zai)取(qu)值,結果(guo)一樣(yang)。


記(ji)住。。。指(zhi)針就是地(di)址數字而(er)已,可(ke)以轉成任(ren)意類型,可(ke)以按(an)照指(zhi)針對(dui)應類型的大小做加減法偏移(yi),也可(ke)以按(an)照指(zhi)針對(dui)應類型的大小做數組(zu)偏移(yi)。

在線客服
客服(fu)電話
  • 0755-23712116
  • 13310869691