C 雜談之 指標與數組 (一)

來源:互聯網
上載者:User
 思維導圖 

  介紹 1> 指標定義:指標是儲存變數地址的變數。 2> 本文重點         >> 指標與數組之間的關係         >> 操縱指標的規則 3> 指標優點         >> 表達某個計算的唯一途徑         >> 代碼更高效,更緊湊            4> 指標缺點:難以理解,但是用好了,代碼會非常清晰。 5> 將指標、數組和地址的算術運算整合在一起是C語言的一大優點。  指標與地址 1> 記憶體組織方式

     (1) 記憶體是一個個單元組成的,每一個記憶體單元中存放一個位元組(8位)的二進位資訊。     (2) 機器中的記憶體單元是有序排列的。     (3) 機器給各個記憶體單元規定不同地址來管理記憶體。這樣,CPU通過地址來識別不同的記憶體單元,正確的對記憶體單元進行操作。 2> 指標與變數的關係(P:是指標變數,C:記憶體對象)

  >>> P:儲存C:中的單元首地址——這裡的地址不是物理地址,而是經過地址映射後的虛擬位址,即邏輯地址。

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

 3>理解指標

   >>>  指標佔用的記憶體空間大小: 32位系統佔用4byte,64為8byte。

機器配置:

列印指標大小:

   >>>  指標就是地址——我們可以把指標認為是用來存放地址的資料類型。不能把指標簡簡單單的當成一個整型數,雖然地址的值是一個整型資料。

   >>>  指標是有類型的,但是這個類型不是給指標分配記憶體的,而是用來定址的。

 

 指標與函數參數 1.普通參數:C語言通過傳值方式將值傳遞給被調用函數。   >> 會把變數的值複製一份給被調用函數。   >> 複製:會把變數的值賦值給一個新的變數(參數)——變數和新的變數必須有相同的儲存容量。   >> 被調用函數並不能修改 主調程式中的變數值,因為被調用函數使用的是一個複製過來的記憶體單元。 2.指標參數: 本質上跟普通參數傳遞是相同的,也進行了變數複製,但是傳過去的值是地址。 被調用函數通過地址能夠訪問和修改主調程式中變數的值。 3.參數在記憶體消耗  普通參數:取決於申明類型。char:1個位元組;short:2個位元組;long:8個位元組  指標參數:指標變數裡儲存的是地址(一般是4個位元組——32位),永遠是一個固定長度,不管是什麼類型的指標。——除非處理器變化不是32位。 4.double *dp, atof(char *)  這裡的dp是指標變數,而atof是函數

 

 指標與數組 1.指標運算元組快於下標運算元組2.數組的空間分配.如int a[10];——會在空間分配出40個相鄰的記憶體單元來(10*4)。

3.指標運算元組 
int *pa;pa = &a[0];

 

  4.指標移動
int *pa;
int a[10];
pa = &a[0];
pa+1將指向下一個元素a[1]: >> 記憶體中的變化:"指標加1"會根據指標指定的類型int移動4個記憶體單元,其實本身並沒有移動,只是pa+1等於第5個記憶體單元地址——“指標加1”中的1的大小是取決於pa的類型int的,指標類型決定指標跨記憶體單元的步長。 >> pa+1 等於是指向第5個記憶體單元——a[1]的第一個記憶體單元。 

 5.規則:   >> &a[i]和a+i含義相同,相互使用。a+i是a之後第i個元素地址。   >> 數組名代表數組第一個元素的地址。  地址運算子 1. 指標初始化:0或表示地址的運算式。 2. “指標加1”中的“1”的大小根據資料類型的長度按比例縮放。如果int類型佔4個位元組的儲存空間,對應的1按4倍計算。

 

驗證:

 >>> 若指向char類型的指標p的記憶體位址是0x000000,那麼p+1後的地址是0x000001。

驗證過程如下:

運行結果:

 

>>> 若指向int 類型的指標p的記憶體位址是0x000000,那麼p+1後的地址是0x000004。

運行結果:

 

3.指向不同數組的元素的指標之間的算術或比較運算都沒有定義。

 

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

代碼驗證:

運行結果:

 流程變化:q-p=16 => 16/4=4 (按照int型所佔記憶體單元等比例縮放) => 4 + 1 = 5;

 

 總結 這次寫關於c語言方面指標,是因為這兩天看php核心檔案的時候,由於C方面的欠缺,所以看著很吃力。所以想再複習下C語言。 為什麼從指標入手呢?可能是因為指標在C語言中是比較難的。所以先把最難的啃下來。 本來是想一次性寫完,可是指標這方面內容太多,所以決定分幾批寫。 我在C語言方面還是很薄弱,如果文章中有錯誤,希望高手們指點下。  我知道部落格園C方面高手非常多,我在C方面屬於菜鳥層級的,沒有任何開發經驗,所以希望高手們能多指點下!

 

 

 

參考文獻:《C程式設計語言》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.