日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C 雜談之 指針與數(shù)組 (一)

 精髓_感知力 2016-01-08
 思維導(dǎo)圖






 介紹


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


2> 本文重點(diǎn)

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

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


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

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

         >> 代碼更高效,更緊湊



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


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



 指針與地址


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

內(nèi)存組織


     (1) 內(nèi)存是一個個單元組成的,每一個內(nèi)存單元中存放一個字節(jié)(8位)的二進(jìn)制信息。

     (2) 機(jī)器中的內(nèi)存單元是有序排列的。

     (3) 機(jī)器給各個內(nèi)存單元規(guī)定不同地址來管理內(nèi)存。這樣,CPU通過地址來識別不同的內(nèi)存單元,正確的對內(nèi)存單元進(jìn)行操作。



2> 指針與變量的關(guān)系(P:是指針變量,C:內(nèi)存對象)



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


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


 3>理解指針


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


機(jī)器配置:



打印指針大小:




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


   >>>  指針是有類型的,但是這個類型不是給指針分配內(nèi)存的,而是用來尋址的。


 


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


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


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

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

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


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


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

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

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


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


 


 指針與數(shù)組



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

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




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



int *pa;
pa = &a[0];


 




 4.指針移動



int *pa;
int a[10];
pa = &a[0];



pa+1將指向下一個元素a[1]:

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


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





 5.規(guī)則:

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

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




 地址運(yùn)算符




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


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



 


驗證:


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


驗證過程如下:



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



 


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



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



 


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


 


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


代碼驗證:



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



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


 




 總結(jié)


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


為什么從指針入手呢?可能是因為指針在C語言中是比較難的。所以先把最難的啃下來。




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


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



我知道博客園C方面高手非常多,我在C方面屬于菜鳥級別的,沒有任何開發(fā)經(jīng)驗,所以希望高手們能多指點(diǎn)下!

 


 


 


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


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多