欧美日韩在线第一页-欧美日韩在线观看精品-欧美日韩在线观看一区二区-欧美日韩在线免费看-欧美日韩在线视频不卡一区二区三区

編程代碼
新聞詳情

「C++」讀懂指針與內(nèi)存

發(fā)布時(shí)間:2021-01-18 09:08:08 瀏覽次數(shù):3072

C和C++最強(qiáng)大的地方在哪里呢?就是指針對(duì)內(nèi)存的操作。有了指針我們才可以在代碼內(nèi)存里自由飛翔,想玩哪里玩哪里,想變什么變什么。


內(nèi)存
首先我們聊聊什么是內(nèi)存(我們以32位程序模型為例)。對(duì)于一個(gè)進(jìn)程來(lái)說(shuō),內(nèi)存可以理解成一連串的帶編號(hào)的存儲(chǔ)區(qū)域。

每個(gè)進(jìn)程都映射一段連續(xù)的虛擬內(nèi)存地址(不是內(nèi)存的真實(shí)物理地址,只是一個(gè)編號(hào),物理內(nèi)存地址可以不連續(xù))。

「C++」讀懂指針與內(nèi)存

每個(gè)格子我們理解為一個(gè)字節(jié),也就是一個(gè)byte或者說(shuō)一個(gè)unsigned char。


而指針其實(shí)就是一個(gè)數(shù)字,記錄的就是內(nèi)存的地址,也就是我們標(biāo)記的每個(gè)小格子的數(shù)字編號(hào)。

在32位系統(tǒng)的時(shí)候,指針占4個(gè)字節(jié),能表示的數(shù)字最大值是4294967295。

(64位程序指針占8個(gè)字節(jié),所以能使用的內(nèi)存空間就很大)

「C++」讀懂指針與內(nèi)存

「C++」讀懂指針與內(nèi)存

將4294967295個(gè)字節(jié)轉(zhuǎn)換G單位大概就是4G。所以32位程序能用的最大內(nèi)存空間就是4G。其中0到3G是用戶(hù)空間,3G到4G是內(nèi)核空間,我們?cè)趯?shí)際使用32位程序時(shí)候,大概也就能操作到1.7G左右的內(nèi)存,超過(guò)這個(gè)量再分配內(nèi)存基本上程序就崩潰了。


程序的內(nèi)存區(qū)域大概分了如圖六塊,其中堆和棧是根據(jù)實(shí)際運(yùn)行情況擴(kuò)展使用內(nèi)存區(qū)域。

「C++」讀懂指針與內(nèi)存

來(lái)來(lái)來(lái)。。我們寫(xiě)段代碼驗(yàn)證下,都用int變量,偏移量是4個(gè)字節(jié),方便查看。

看看運(yùn)行結(jié)果,內(nèi)存地址就是這樣按照區(qū)域分配的。

「C++」讀懂指針與內(nèi)存

「C++」讀懂指針與內(nèi)存

指針

明白了內(nèi)存,我們就來(lái)玩玩指針,看他怎么個(gè)自由飛翔。

先上一段樸實(shí)的代碼:

「C++」讀懂指針與內(nèi)存

運(yùn)行結(jié)果是這樣的:

「C++」讀懂指針與內(nèi)存

讓我們來(lái)分析下這段代碼吧。


為了方便使用結(jié)構(gòu)體倒騰,我這里都用的是4倍體的變量,而且把double放在了第一個(gè)。關(guān)于結(jié)構(gòu)體排列問(wèn)題有機(jī)會(huì)我再寫(xiě)寫(xiě)。反正這里呢,就按照這幾個(gè)位置排列內(nèi)存了。


首先我們整了一個(gè)100字節(jié)的內(nèi)存,神馬都沒(méi)有,然后通過(guò)指針和偏移量,我們可以跳轉(zhuǎn)到內(nèi)存任意位置,并且可以把那個(gè)位置解釋成任意類(lèi)型。所以指針可以是8字節(jié)的double類(lèi)型,也可以是4字節(jié)的int和float類(lèi)型,然后對(duì)該類(lèi)型直接賦值。

最后,我們直接來(lái)個(gè)風(fēng)騷操作,把這段內(nèi)存強(qiáng)制當(dāng)成結(jié)構(gòu)體類(lèi)型的指針,然后因?yàn)槲恢媚軐?duì)上,所以結(jié)構(gòu)體內(nèi)的成員變量就都對(duì)應(yīng)上了。


然后我們?cè)賮?lái)玩一玩快樂(lè)指針的游戲,依然使用剛才內(nèi)存倒騰過(guò)的區(qū)域。

「C++」讀懂指針與內(nèi)存

這里p指向了b變量的位置,此時(shí)我們可以把p當(dāng)成一個(gè)int數(shù)組,所以p[3]就是該數(shù)組第四個(gè)元素,也就是變量e。

「C++」讀懂指針與內(nèi)存

這里p+2表示按照指針類(lèi)型移動(dòng)2個(gè)位置,int是4個(gè)字節(jié),所以?xún)?nèi)存上總共移動(dòng)8個(gè)字節(jié),到了d的位置,雖然位置對(duì)了,但是d不是一個(gè)int類(lèi)型,按照int去解釋是錯(cuò)誤的。所以我們把類(lèi)型解釋成float。

「C++」讀懂指針與內(nèi)存

當(dāng)然因?yàn)閒loat也是4個(gè)字節(jié),所以我們可以p[2]直接取到d位置的值,此時(shí)這里是解釋出來(lái)的int值是錯(cuò)誤的,然后我們?nèi)〉刂纷兂芍羔槪購(gòu)?qiáng)轉(zhuǎn)成float指針,再取值,結(jié)果一樣。


記住。。。指針就是地址數(shù)字而已,可以轉(zhuǎn)成任意類(lèi)型,可以按照指針對(duì)應(yīng)類(lèi)型的大小做加減法偏移,也可以按照指針對(duì)應(yīng)類(lèi)型的大小做數(shù)組偏移。

在線(xiàn)客服 雙翌客服
客服電話(huà)
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 91刘亦菲精品福利在线| 亚洲欧美精品一区| 手机看片自拍| 欧美一区高清| 国产成人高清精品免费软件| 撸大师视频在线观看| 久久久久日韩精品免费观看网| 亚洲欧美一区二区三区二厂| 一级毛片免费在线| 午夜毛片不卡高清免费| 农村一级黄色片| 欧美偷拍小视频| 国产欧美日韩在线一区二区不卡| 韩国xxxxxxxx69| www.小视频| 国产色图片| 毛片高清一区二区三区| 手机看片日韩国产| 亚洲美女久久| 综合在线视频精品专区| 一级片网| 大陆一级毛片免费高清| 日本视频中文字幕一区二区| 亚洲人xx视频| 色综合久久综合中文小说| 国产aa毛片| 国产成人影院| 国产欧美亚洲精品第一区| 国产精品免费观看视频播放| 高清欧美在线三级视频| 麻豆日韩区久久综合| 播播网手机在线播放| 嫩操影院| 26uuu欧美视频在线观看| 非洲一级毛片又粗又长aaaa| 国产精品欧美视频另类专区| 国内精品自在欧美一区| 久久www免费人成高清| 久久精品首页| 久久国产精品老女人| 久久青草免费线观最新|