C語言指針及占據(jù)內存空間

目錄:

第一、了解內存空間

第二、理解指針

第三、指針運算問題


正文:


第一、了解內存空間

本文章文字有點多,會有點枯燥,配合圖文一起看可以緩解枯燥,耐心閱讀哦?。。?/p>

先了解內存地址,才更好的理解指針!

我們可以把內存想象為成一列很長很長的貨運火車,有很多大小相同的車廂,而每個車廂正好相當于在內存中表示一個字節(jié)。這些車廂裝著不同的貨物,就像我們的內存要存著各式各樣的數(shù)據(jù)。

多啰嗦一下

我們平時在電腦上能夠聽音樂、看視頻和文章,其實看到的這些東西就是內存中每個“車廂”里面的數(shù)據(jù),這些數(shù)據(jù)最終還是由二進制0/1演變而成。

雖然視頻、文章、音樂等這些信息在我們眼里是不同的,但對于計算機來說它們在內存中都是以二進制的形式來表示。

因為我們要知道去哪存或取數(shù)據(jù),所以內存中每個字節(jié)都有對應的編號,就像火車上的車廂編號一樣。而這個內存中每個字節(jié)的編號就是我們常說的內存地址,是按一個字節(jié)接著一個字節(jié)的次序進行編址。如下圖所示:

凡事多問幾個為什么?

1. 為什么內存地址都有0x開頭?

0x 開頭代表以十六進制來表示的意思。

2. 為什么我們平時看到內存地址是這樣的呢?如圖:

因為內存容量很大,容量大字節(jié)數(shù)自然也多了,所以需要更多位來編址內存地址。上圖的(0x00 ...)內存地址這里只是便于理解!

3. 為什么我那么菜呢?

哈哈哈......你心里沒點*數(shù)嗎?

關于內存字節(jié)

1個內存地址只存1個字節(jié) (Byte);

1個字節(jié)等于8位二進制,每一位二進制的0或1,叫“比特”(bit);

比特是最小單位,字節(jié)是比特的集合,也是一個單位;

內存給數(shù)據(jù)類型地址分配如下:

char:占一個字節(jié)分配一個地址;

int: 占四個字節(jié)分配四個地址;

還有l(wèi)ong、float、double等類型,等著你來動手測試。

可以使用sizeof進行驗證:


?結果如下:


第二、理解指針

不要把指針想得太復雜,指針的實質就是內存“地址”,可以說指針就是地址,其實指針就是保存地址的變量。

拿普通變量跟指針變量做比較:


舉個例子,給指針變量進行賦值:


輸出結果為:

我是a變量的值:5我是a的地址:000000000062FE17

我是b變量的值:000000000062FE17

通過畫圖來理解:

通過指針間接性修改變量的值


指針類型的概念

我們知道char類型的數(shù)據(jù)只占一個字節(jié),有很多類型是需要多個字節(jié)來存儲的,像int類型的數(shù)據(jù)就需要四個字節(jié)來存儲(根據(jù)平臺不同,長度也有可能不一致)。

對于int類型的指針從當前字節(jié)(地址)開始共四個字節(jié)(地址)都是屬于該變量的值, 而對于char類型則只表示當前字節(jié)(地址)。代碼如下:


通過畫圖來便于理解:

通過上文我們已經對int類型指針有所了解了,*p1的輸出是在我們預算范圍之內的,但是為什么*p2輸出的值是3呢?

重點,敲黑板?。?!

因為計算機是使用二進制來表示數(shù)字的,上面(259)十進制轉換二進制是 [100000011],由于一個int類型變量占用四個字節(jié),8位二進制為一個字節(jié),補齊高位的0后,則 [00000000 00000000 00000001 00000011],每8位二進制(一個字節(jié))換算為十進制,則 [0 ?0? 1? 3]。

此時你應該差不多明白*p2為什么輸出的值為3了吧,但是內存地址中有個概念叫"大小端模式",就會有兩種不同的排序:[0 ?0? 1? 3] or [3 ?1? 0? 0]。

由于計算機讀取*p2的地址是0x00,所以直接輸出這個地址上的數(shù)據(jù),你也可以試著改一下,把259換成258/257等,看看是否正如所說。

驗證它們存儲地址,代碼如下:


輸出結果正如我們預想的:

當你看到這里的時候,你只是剛剛認識指針而已,以上是我們俗稱的一級指針,一級指針是比較簡單的,還有二級指針和多級指針,更繞、更難理解,接下來介紹一下二級指針。

在講二級指針前,我們是否有疑問:什么是一級指針?什么是二級指針呢?兩者有什么區(qū)別呢?

一級指針存儲變量的地址,通過這個地址"直接獲取"變量的數(shù)據(jù)。

二級指針存儲一級指針的地址,二級指針通過一級指針"間接獲取"獲取變量的數(shù)據(jù)。

多級指針以此類推,個人理解,講的不對歡迎指正。

再堅持一下,精彩在"下面"?。?![/滑稽]

二級指針

“指針的指針”也就是我們俗稱的二級指針。

什么是“指針的指針”,例如下面代碼:


通過畫圖來理解:

多級指針也就是指針的指針的指針.....,以此類推即可。


第三、指針運算問題

指針運算是根據(jù)指針的類型不同而進行運算的,因類型的不同,在加1/減1操作時,內存分配的空間也不同。

又拿int類型和char類型來作比較,代碼如下:

char類型+1:從輸出結果可以看出地址是遞增1的,正符合char類型占一個字節(jié)的說法。


int類型+1:輸出的地址之間相差為4,正是int類型占據(jù)空間。


想要成為一個優(yōu)秀的、有能力程序員,做軟件開發(fā)的話,就來學習C/C++吧,而且學習編程的話有一個學習的氛圍跟交流圈子特別重要!這里我推薦一個C語言C++交流扣裙,--先八七零九;后63251,不管你是大牛還是小白,大家都一起成長進步。


char類型和int類型分別+1在內存中地址分配,如圖:

指針就介紹到這里,這只是指針的基礎,還有數(shù)組指針、指針數(shù)組、null指針、void指針等等知識,還需要學習,后續(xù)繼續(xù)更新。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容