中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

C語(yǔ)言雜談:指針與數(shù)組 (上)

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

思維導(dǎo)圖

介紹

1> 指針定義:指針是保存變量地址的變量。

2> 本文重點(diǎn)

>> 指針與數(shù)組之間的關(guān)系

>> 操縱指針的規(guī)則

3> 指針優(yōu)點(diǎn)

>> 表達(dá)某個(gè)計(jì)算的唯一途徑

>> 代碼更高效,更緊湊

4> 指針缺點(diǎn):難以理解,但是用好了,代碼會(huì)非常清晰。

5> 將指針、數(shù)組和地址的算術(shù)運(yùn)算集成在一起是C語(yǔ)言的一大優(yōu)點(diǎn)。

指針與地址

1> 內(nèi)存組織方式

(1) 內(nèi)存是一個(gè)個(gè)單元組成的,每一個(gè)內(nèi)存單元中存放一個(gè)字節(jié)(8位)的二進(jìn)制信息。
(2) 機(jī)器中的內(nèi)存單元是有序排列的。
(3) 機(jī)器給各個(gè)內(nèi)存單元規(guī)定不同地址來(lái)管理內(nèi)存。這樣,CPU通過(guò)地址來(lái)識(shí)別不同的內(nèi)存單元,正確的對(duì)內(nèi)存單元進(jìn)行操作。
2> 指針與變量的關(guān)系(P:是指針變量,C:內(nèi)存對(duì)象)

>>> P:保存C:中的單元首地址——這里的地址不是物理地址,而是經(jīng)過(guò)地址映射后的虛擬地址,即邏輯地址。

>>> P:為指向C:的指針

3>理解指針

>>> 指針占用的內(nèi)存空間大小: 32位系統(tǒng)占用4byte,64為8byte。

機(jī)器配置:

打印指針大小:

>>> 指針就是地址——我們可以把指針認(rèn)為是用來(lái)存放地址的數(shù)據(jù)類型。不能把指針簡(jiǎn)簡(jiǎn)單單的當(dāng)成一個(gè)整型數(shù),雖然地址的值是一個(gè)整型數(shù)據(jù)。

>>> 指針是有類型的,但是這個(gè)類型不是給指針?lè)峙鋬?nèi)存的,而是用來(lái)尋址的。

指針與函數(shù)參數(shù)

1.普通參數(shù):C語(yǔ)言通過(guò)傳值方式將值傳遞給被調(diào)用函數(shù)。

>> 會(huì)把變量的值復(fù)制一份給被調(diào)用函數(shù)。

>> 復(fù)制:會(huì)把變量的值賦值給一個(gè)新的變量(參數(shù))——變量和新的變量必須有相同的存儲(chǔ)容量。

>> 被調(diào)用函數(shù)并不能修改主調(diào)程序中的變量值,因?yàn)楸徽{(diào)用函數(shù)使用的是一個(gè)復(fù)制過(guò)來(lái)的內(nèi)存單元。

2.指針參數(shù): 本質(zhì)上跟普通參數(shù)傳遞是相同的,也進(jìn)行了變量復(fù)制,但是傳過(guò)去的值是地址。 被調(diào)用函數(shù)通過(guò)地址能夠訪問(wèn)和修改主調(diào)程序中變量的值。

3.參數(shù)在內(nèi)存消耗

普通參數(shù):取決于申明類型。char:1個(gè)字節(jié);short:2個(gè)字節(jié);long:8個(gè)字節(jié)

指針參數(shù):指針變量里存儲(chǔ)的是地址(一般是4個(gè)字節(jié)——32位),永遠(yuǎn)是一個(gè)固定長(zhǎng)度,不管是什么類型的指針。——除非處理器變化不是32位。

4.double *dp, atof(char *) 這里的dp是指針變量,而atof是函數(shù)

指針與數(shù)組

1.指針操作數(shù)組快于下標(biāo)操作數(shù)組

2.數(shù)組的空間分配.如int a[10];——會(huì)在空間分配出40個(gè)相鄰的內(nèi)存單元來(lái)(10*4)。

3.指針操作數(shù)組

int *pa;

pa = &a[0];

4.指針移動(dòng)

int *pa;

int a[10];

pa = &a[0];

pa+1將指向下一個(gè)元素a[1]:

>> 內(nèi)存中的變化:”指針加1″會(huì)根據(jù)指針指定的類型int移動(dòng)4個(gè)內(nèi)存單元,其實(shí)本身并沒(méi)有移動(dòng),只是pa+1等于第5個(gè)內(nèi)存單元地址——“指針加1”中的1的大小是取決于pa的類型int的,指針類型決定指針跨內(nèi)存單元的步長(zhǎng)。

>> pa+1 等于是指向第5個(gè)內(nèi)存單元——a[1]的第一個(gè)內(nèi)存單元。

5.規(guī)則:

>> &a[i]和a+i含義相同,相互使用。a+i是a之后第i個(gè)元素地址。

>> 數(shù)組名代表數(shù)組第一個(gè)元素的地址。

地址運(yùn)算符

1. 指針初始化:0或表示地址的表達(dá)式。

2. “指針加1”中的“1”的大小根據(jù)數(shù)據(jù)類型的長(zhǎng)度按比例縮放。如果int類型占4個(gè)字節(jié)的存儲(chǔ)空間,對(duì)應(yīng)的1按4倍計(jì)算。

驗(yàn)證:

>>> 若指向char類型的指針p的內(nèi)存地址是0×000000,那么p+1后的地址是0×000001。

驗(yàn)證過(guò)程如下:

運(yùn)行結(jié)果:

>>> 若指向int 類型的指針p的內(nèi)存地址是0×000000,那么p+1后的地址是0×000004。

運(yùn)行結(jié)果:

3.指向不同數(shù)組的元素的指針之間的算術(shù)或比較運(yùn)算都沒(méi)有定義。

4.指針相減:如果p和q指向相同數(shù)組中的元素,且p<q,那么q-p+1就是p和q之間的元素(包括p和q)

代碼驗(yàn)證:

運(yùn)行結(jié)果:

流程變化:q-p=16 => 16/4=4 (按照int型所占內(nèi)存單元等比例縮放) => 4 + 1 = 5;

總結(jié)

這次寫關(guān)于c語(yǔ)言方面指針,是因?yàn)檫@兩天看php內(nèi)核文件的時(shí)候,由于C方面的欠缺,所以看著很吃力。所以想再?gòu)?fù)習(xí)下C語(yǔ)言。

為什么從指針入手呢?可能是因?yàn)橹羔樤贑語(yǔ)言中是比較難的。所以先把最難的啃下來(lái)。

本來(lái)是想一次性寫完,可是指針這方面內(nèi)容太多,所以決定分幾批寫。

我在C語(yǔ)言方面還是很薄弱,如果文章中有錯(cuò)誤,希望高手們指點(diǎn)下。

參考文獻(xiàn):《C程序設(shè)計(jì)語(yǔ)言》

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:你會(huì)為了性能而犧牲代碼簡(jiǎn)潔性嗎?

下一篇:2015年5月TIOBE編程語(yǔ)言排行榜單