指針變量、普通變量、內存和地址的全面對比

本篇文章,將提到4個概念:html

一、普通變量程序員

二、指針變量web

三、內存(內存空間)編程

四、地址post

咱們先看內存是什麼?內存是實實在在的硬件,能夠存放數據!在咱們的一塊可編程的芯片的內部有大把的內存。spa

形象一點,內存就像一個個的小格子,每一個格子的大小是一個字節,能夠存放一個字節的數據。指針

那這麼多內存如何區分呢?那就得靠地址。地址是內存的標識,每個地址都對應一個內存。因此內存和地址是一一對應密不可分的。orm

 

 

接着看,什麼是普通變量?htm

如 char a; 就是一個普通變量。普通變量a實際上是語言自己創造了,是爲了更方便的表示內存。咱們對a進行訪問其實就是直接對內存進行訪問。至於a表示的內存的地址是多少,程序員通常不用關心。編譯器會自動分配地址,也就是常說的爲a分配一個地址。若是想知道a的地址也能夠經過&a得知。blog

再看指針變量,他和普通變量的區別在於,普通變量是和一塊內存空間關聯。而指針變量倒是和兩塊內存空間想關聯:

一、保存指針變量自己的空間,這個空間大小是固定的,32位系統中是4個字節。

二、指針指向的內存空間。

如char* a;  指針變量a,他自己須要一個空間,也就是上面說的(1)。

而(1)這個空間存放的內容是另外一個內存空間的首地址。指針變量能夠經過改變本身去訪問其餘地方的內存空間。

若是說普通變量有兩種形態:

一、a   表示一塊內存空間

二、&a  表示當前內存空間的地址

   那麼指針變量就具備3種形態:

   一、a   表示指針a對應的內存空間(能夠說就是指針自己的值)
 
   二、&a  表示當前指針對應的內存空間的首地址(存放指針的地址)
 
   三、*a  表示指針a所指向的變量對應的整個內存空間。(指針指向的空間)

   若是硬要說第4種形態,就是是p->x,這種形態出如今結構體變量訪問本身的成員的時候。p->x結合以後看出一個總體,其實就是表明x對應的那塊內存。這裏須要注意的是「->」這個符號,不要理解成指針p指向x,而應該將p->x當作一個總體,「->」只是一個操做符將p和x結合到一塊兒,就能夠表示x所對應的內存。

  以上結論是具備通用性的。思考下,若是p是結構體指針,那麼*p又是什麼呢?雖說*p的值意義不大。*p就是對應整個結構體的變量內存空間。這個普通的*a解釋起來是同樣的——表示指針a所指向的變量對應的整個內存空間。(能夠用程序證實這一點,爲了文章主線,證實過程我想放到《解引用結構體指針的值是什麼》這篇文章中單獨講述)

以上就簡單介紹完了普通變量、指針變量、內存(內存空間)、地址,這四個概念,而且詳細對比了普通變量和指針變量的區別。

 

接下來,看看地址與指針以及數字常量的區別。

一、指針也稱爲指針變量,地址是個常量。指針指向地址。地址僅僅是內存的標號。

二、如何把一個數強制轉換爲一個指針類型。

把一個數強制轉換成指針類型:如int*(0)那麼,那麼int*(0)是一個指針,而不是地址。(編譯器會爲int*(0)分配內存)

其實就是: int* p = int*(0);  那麼p 就至關與這個int*(0)。

這個指針指向0這個地址。因此此時0表示地址,int*(0)是指針。

三、雖然指針不是地址,可是和地址相匹配,能夠將地址賦值給指針。固然也能夠直接給指針賦值一個數字常量。可是通常不要這麼作,應爲這個數所表明的地址,多是你不應訪問的,可能會致使段錯誤。

因此指針的賦值通常是將變量取地址賦值給指針,或者經過指針賦值給指針(p = &a 或者 p = p1)。

 

 

 

最後,簡單描述下。指針與內存空間的關係——指針是內存空間的控制器。不一樣類型的指針,擁有不一樣的內存管理能力。如int*a 和

char* a管理內存的方式是不同的。進一步理解能夠升入到結構體變量指針(類變量指針),各自有着各類管理內存的方法。

若是你能理解指針是內存的控制器,那麼就能理解鏈表的實現。鏈表會在另一篇博客詳細介紹。

指針和內存進一步的分析,我也放到另外一篇博客~~就到這裏~~

相關文章
相關標籤/搜索