指標變數 普通變數 記憶體和位址的全面對比

2022-03-04 17:46:46 字數 1807 閱讀 3591

1、普通變數

2、指標變數

3、記憶體(記憶體空間)

4、位址

我們先看記憶體是什麼?記憶體是實實在在的硬體,可以存放資料!在我們的一塊可程式設計的晶元的內部有大把的記憶體。

形象一點,記憶體就像乙個個的小格仔,每個格仔的大小是乙個位元組,可以存放乙個位元組的資料。

那這麼多記憶體如何區分呢?那就得靠位址。位址是記憶體的標識,每乙個位址都對應乙個記憶體。所以記憶體和位址是一一對應密不可分的。

接著看,什麼是普通變數?

如 char a; 就是乙個普通變數。普通變數a其實是語言本身創造了,是為了更方便的表示記憶體。我們對a進行訪問其實就是直接對記憶體進行訪問。至於a表示的記憶體的位址是多少,程式設計師一般不用關心。編譯器會自動分配位址,也就是常說的為a分配乙個位址。如果想知道a的位址也可以通過&a得知。

再看指標變數,他和普通變數的區別在於,普通變數是和一塊記憶體空間關聯。而指標變數卻是和兩塊記憶體空間想關聯:

1、儲存指標變數本身的空間,這個空間大小是固定的,32位系統中是4個位元組。

2、指標指向的記憶體空間。

如char* a;  指標變數a,他本身需要乙個空間,也就是上面說的(1)。

而(1)這個空間存放的內容是另乙個記憶體空間的首位址。指標變數可以通過改變自己去訪問其他地方的記憶體空間。

如果說普通變數有兩種形態:

1、a   表示一塊記憶體空間

2、&a  表示當前記憶體空間的位址

那麼指標變數就具有3種形態:

1、a   表示指標a對應的記憶體空間(可以說就是指標本身的值)

2、&a  表示當前指標對應的記憶體空間的首位址(存放指標的位址)

3、*a  表示指標a所指向的變數對應的整個記憶體空間。(指標指向的空間)

如果硬要說第4種形態,就是是p->x,這種形態出現在結構體變數訪問自己的成員的時候。p->x結合之後看出乙個整體,其實就是代表x對應的那塊記憶體。這裡需要注意的是「->」這個符號,不要理解成指標p指向x,而應該將p->x看成乙個整體,「->」只是乙個操作符將p和x結合到一起,就可以表示x所對應的記憶體。

以上結論是具有通用性的。思考下,如果p是結構體指標,那麼*p又是什麼呢?雖然說*p的值意義不大。*p就是對應整個結構體的變數記憶體空間。這個普通的*a解釋起來是一樣的——表示指標a所指向的變數對應的整個記憶體空間。(可以用程式證明這一點,為了文章主線,證明過程我想放到《解引用結構體指標的值是什麼》這篇文章中單獨講述)

以上就簡單介紹完了普通變數、指標變數、記憶體(記憶體空間)、位址,這四個概念,並且詳細對比了普通變數和指標變數的區別。

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

1、指標也稱為指標變數,位址是個常量。指標指向位址。位址僅僅是記憶體的標號。

2、如何把乙個數強制轉換為乙個指標型別。

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

這個指標指向0這個位址。所以此時0表示位址,int*(0)是指標。

3、雖然指標不是位址,但是和位址相匹配,可以將位址賦值給指標。當然也可以直接給指標賦值乙個數字常量。但是一般不要這麼做,應為這個數所代表的位址,可能是你不該訪問的,可能會導致段錯誤。

所以指標的賦值一般是將變數取位址賦值給指標,或者通過指標賦值給指標(p = &a 或者 p = p1)。

最後,簡單描述下。指標與記憶體空間的關係——指標是記憶體空間的控制器。不同型別的指標,擁有不同的記憶體管理能力。如int*a 和

char* a管理記憶體的方式是不一樣的。進一步理解可以公升入到結構體變數指標(類變數指標),各自有著各種管理記憶體的方法。

如果你能理解指標是記憶體的控制器,那麼就能理解鍊錶的實現。鍊錶會在另外一篇部落格詳細介紹。

指標和記憶體進一步的分析,我也放到另一篇部落格~~就到這裡~~

final變數和普通變數的區別

public class test public static void main string args string a handao final string b han string c han string d b dao string e c dao system.out.println...

對c語言普通變數和指標變數的理解

一 普通變數和的本質區別 在說到普通變數和指標變數的區別時,我更喜歡從乙個更高的視角去看待這兩者。首先來說,這兩者都是變數,既然是變數,就會包含位址和值這兩部分,例如int a 用 a獲得該變數的位址,用a獲得該變數的值 普通變數和指標變數的區別就是,這兩種 變數的值的所表示的意義不同,一般來說,普...

屬性和普通變數區別

1 資料安全 因為a是個公有變數,在類的外部可以任意更改,為了防止因使用者任意更改,可用屬性get set來限制 b的的唯讀 只寫或控制 b的最大或最小 引用一位老兄的簡答 其實自定義變數已經預設實現了屬性,只是簡單的讀寫而已,我們定義的屬性要在讀寫的基礎上加上更多限制,以後你學的多了就會發現,很多...