專欄導航
上一篇:WIndows 編程輔助技能:格式工廠的使用
回到目錄
下一篇:MFC 第一章概述
本節前言
本來呢,沒想著在單獨的課節中講解內存模型。但是呢,在我寫過的一些個課節中,我發現,內存模型,大概還是有必要去講一講的。不然的話,每次涉及這一知識點的時候,我還得費勁巴力地再來講一次,實在是麻煩。
學習本節之前,我們需要大家學習過十六進制的知識。在本專欄的預備章節中,有關于十六進制的知識的講解。不會的話,你可以參照相應的課節,來學習進制知識。
本節,我僅僅列出講解十六進制知識的其中幾個參考課節。
課節:計算機基礎:二進制基礎10,用十六進制來查數
課節:計算機基礎:二進制基礎11,十六進制的位基和位權
課節:計算機基礎:二進制基礎12,十進制數轉換為十六進制
課節:計算機基礎:二進制基礎13,十六進制與二進制的相互轉換
你可以先學習本節的后續知識。遇到不會的,再去參考課節中,學習進制知識。或者,你也可以在本專欄目錄中,在預備章節里面,系統地學習進制知識。
這樣子說起來,也許你會覺得很麻煩。沒辦法,學習計算機知識,有些時候,確實是會麻煩一些。
一.? ? 物理內存
首先呢,我們來看一看內存的實物。



上面的三張圖,就是電腦里的內存條,就是物理內存。
這些個東西,對于組裝電腦,升級配件的人是有用的。然而,對于程序員來講,我們所關注的,并不是內存的物理形狀。
二.? ? 內存的抽象
程序員并不關注內存的物理形態,關心的是它在編程方面的抽象含義。
在計算機里面,有很多的地方,可以用來存儲數據。在內存里面可以存儲數據,在寄存器里面也可以存儲數據。存儲數據的最小單位,是比特。一個比特,要么存儲 0,要么存儲 1 。連續的 8 個比特,為一個字節。
所以呢,一個比特,它包含著 8 個二進制位,也就是包含著 8 個比特。
雖說,計算機存儲數據的最小單位是比特,但是,計算機存儲數據的基本單位,卻不是比特,而是一個字節。
在基礎的 C/C++ 學習里面,可以用來存儲一個字節的數據類型有兩種,一個是 signed char 型,另一個是 unsigned char 型。C 語言對于 char 數據類型究竟歸屬于 signed char 還是歸屬于 unsigned char,是沒有定義的。因此,不同的編譯器,可以作出不同的處理。
本專欄所采用的 Visual Studio 集成開發環境,它默認地,是將 char 數據類型視為 signed char 類型。
占用一個字節的數據類型有兩個,一個是 signed char,另一個是 unsigned char 。而在這里,我們將 unsigned char 數據類型,起另外的一個名字,叫做字節型。
計算機存儲數據的基本單位,是一個字節。在計算機內存里面,有很多個空間,可以用來存儲數據,可以存儲很多很多的字節的數據。
計算機存儲數據的基本單位,是一個字節。往內存里存儲數據也是一樣的,最起碼得是存儲一個字節,不能再小了。
整個的一個內存,包含著很多很多的字節空間,每一個字節空間,都可以存儲一個字節的數據。所以呢,整個的內存,可以視為一個字節空間集合。或者,我們也可以將一個內存,視為一個字節數組。
申請數組,大家應該會吧。
unsigned char str[100];
上面的代碼,申請了一個字節數組,這個數組包含了 100 個字節的空間。
而計算機內存,其實也是字節數組。只是,這個數組很大很大。
本分節,我們的任務,只是希望讓大家了解一個概念,那就是,在程序員的眼中,內存其實只是一個字節數組。
三.? ? 內存大小
內存中的一個存儲數據的基本單位,是一個字節,也就是一個 Byte,也寫作 B 。1024 個字節,為1 個 KB 。1024 KB,為 1 兆字節,也寫作 1MB 。1024 MB,為 1 吉字節,也寫作 1 GB 。1024 GB,為 1 太字節,也寫作 1? TB 。
1 個字節為 1B 。
1024 B = 1KB 。
1024 KB = 1MB 。
1024 MB = 1 GB 。
1024 GB = 1 TB 。
1024 等于 2 的 10 次方。
1 個字節為 1 B 。
B = 1KB 。
KB = 1MB 。
MB = 1GB 。
GB = 1TB 。
如果你的內存條,只能存儲100個數據,那么,你的內存尺寸就是 100 B 。如果你的內存能夠存儲 1024 個數據,那么,你的內存的尺寸就是 1024 B,也就是 1KB 。如果你的內存能夠存儲 4096 個數據,也就是 4 × 1024 個數據,那么,你的內存的尺寸就是 4 KB 。
內存的尺寸,通常使用 MB,GB 作為計量單位。
我初中的時候,我所聽到的內存尺寸,有 256 MB 的,有 512 MB 的。
后來,聽說了 1GB 的,2GB,4GB 的。而現在的內存,8GB,16GB,32GB,應該都是常見的。因為,低于 4GB 的,根本就運行不了 Win10,Win11 。即使你使用的是 WIn7,Win8,估計,你的電腦,也至少安裝 4GB 的內存。
以上,是我對內存尺寸的講解。
四.? ? 內存地址
內存中,可以用來存儲數據的每一個字節空間,都有一個編號。我們在第二分節中說了,內存的本質 ,是一個尺寸很大的字節數組。這個字節大數組的數組下標,也就是這個字節數組的索引,便是這個字節空間的編號。這個字節空間的索引或編號,便是內存地址。
通常來講,在表示內存地址的時候,我們并不使用十進制數,而是使用十六進制數。習慣上,我們使用八位十六進制數,來表示一個內存地址。
比如說,我們在程序中,申請了一個 char 型變量 ch。假定,這個 char 型變量的地址,為 0x0CE32100 。再假定,我們用 MEM 來表示內存。所以呢,將這個 char 型變量 ch 賦值為 100,相當于是將 MEM[0x0CE32100] 賦值為 100 。
一般來講,程序中的變量的地址,都會是一個比較大的十六進制數,且這個地址值,會用八位十六進制數來表示。這看起來,也許會顯得很不方便。然而,相比十進制表示法來講,十六進制表示法,已經是幫助我們簡化了一些個工作了。
你可以自己試著去編寫一個 C 語言程序,在程序里面申請一個變量,并且測試和打印這個變量的地址。
比如說,我們可以編寫如下的程序。
#include <stdio.h>int main()
{char ch01;char * p;p_ch = &ch01;printf("%p\n", p_ch);return 0;
}
至于說,如何建立 C/C++ 程序項目,如何編譯,運行這個程序,你可以參考如下文章鏈接。
課節:使用 VS2010 編寫 C語言程序
課節:用 VS2019 編寫C語言程序
表示內存地址的時候,所使用的,是十六進制數。剛開始使用十六進制數的時候,你也許會覺得不習慣。其實,在高級語言的學習里面,我們使用十六進制的地方并不多。然而,在你以后去學習匯編語言的時候,學習十六進制的地方,自然地,會多起來。
啥時候去學習和十六進制,你可以自己來安排。但是呢,無論是早還是晚,如果你想要將編程技能練得很棒,那么,二進制,八進制,十六進制的知識,以及許多的系統底層知識,你就都需要去學習了。
至于說,學習順序,自己摸索和安排吧。
結束語
本節的內容,就這么多吧。希望大家能夠學習好本節知識。
?專欄導航
上一篇:WIndows 編程輔助技能:格式工廠的使用
回到目錄
下一篇:MFC 第一章概述