C語言探索之旅 | 第一部分第四課第一章:變數的世界之記憶體那檔事

weixin_33751566發表於2016-07-31
1783214-ea51cec947523ee9.JPG

-- 作者 謝恩銘 轉載請註明出處

經過上一課C語言探索之旅 | 第一部分第三課:你的第一個程式,我們已經知道怎麼在螢幕上顯示文字了。

暫時我們也就只能做這麼多了。而這是正常的,因為我們還沒學習很重要的程式設計知識: 變數

這一課知識點比較多,我們會分為幾個章節來學習:

  • 記憶體那檔事

  • 宣告變數

  • 顯示變數內容和提取輸入內容

第一章我們學習電腦記憶體的知識。

每一個正常人都有記憶,我們的老朋友電腦也不例外,只不過它比我們“厲害”,它的記憶(儲存器)有好幾種。

為什麼電腦要有好幾種儲存器呢?單單一種還不夠嗎?

不夠:主要問題是我們想要電腦有一個既快捷(能夠很快提取資訊)又容量大(能夠儲存很多資料)的儲存器。

然而,你會啞然失笑,因為目前我們還沒有一種兼具快捷和大容量兩種特性的儲存器。更準確地說,高速儲存器太貴,所以容量只能低一點。

因此,我們只能給電腦配備:

  • 要麼是很高速但是低容量的儲存器

  • 要麼是大容量但是低速的儲存器

不同型別的儲存器

以下列出電腦的儲存器型別,從速度最快到速度最慢排序:

1.暫存器(Register):位於處理器(Processor)上,存取速度非常快("近水樓臺先得月")

2.快取記憶體(Cache):用於連結暫存器和記憶體

3.記憶體(Memory):這是我們程式設計時最常打交道的儲存器,也是平時我們買電腦時很關心的資料之一

4.硬碟(Hard Disk):你肯定不陌生,就是平時Windows電腦裡的C盤,D盤之類的(當然還有很多其他型別的硬碟,比如U盤,EEPROM等),我們在裡面儲存檔案,照片,視訊等

正如上面所說,我們這裡把儲存器從最快(暫存器)到最慢(硬碟)做了分類。你應該可以推斷出暫存器相比硬碟來說,容量要小很多。

暫存器只能儲存少量的資料,而硬碟則可以儲存大量的資料。

當我們說一個儲存器慢的時候,其實是相對電腦的處理速度而言的。

讀取硬碟大概要耗費8毫秒,對於一臺電腦來說那已經很慢了(現在普通的家用電腦的運算速度都已經可以達到每秒幾十億次了,1GHz對應每秒10億次,如果你的電腦主頻是2.5GHz,那運算速度就是每秒25億次;現在家用的雙核電腦通常都能達到每秒五十億次運算(2*2.5GHz)左右的水平)

上面所說的內容我們要掌握什麼呢?

事實上,只需要關心一部分就夠了。要知道在程式設計時,我們基本上只和記憶體打交道。我們也會學習如何讀寫硬碟,在硬碟上建立檔案(在之後的課程中,暫時還不學)。至於暫存器和快取記憶體,我們基本不關心,這是電腦的事。

當然,在一些很底層的語言中,比如組合語言(Assembly,簡稱ASM),我們會經常用到暫存器。

小編以前跟著王爽老師的《組合語言》第二版學了彙編,那本書編得挺好。

但是我想說的是,用匯編哪怕只是做個乘法,也是很不容易的。幸運的是,在C語言(或其他大部分語言)中做乘法很簡單。

還要記住一個很重要的知識點:上述四種儲存器型別中,只有硬碟是可以永久儲存資料的,其他的儲存器(暫存器,快取記憶體,記憶體)都是暫時性的儲存器:當你關閉電腦時,這些儲存器會被清空。

幸好,當你重新開啟電腦時,硬碟裡的資料始終存在,所以你的電腦還知道自己姓什名誰。

記憶體

既然我們以後的大部分時間都要跟記憶體打交道,那豈能不來認識認識這位朋友呢?

我們用變焦鏡頭的形式慢慢道來。

一開始看到的是我們的電腦工作環境的整體圖片:

1783214-3e0f291119e1681c.jpg

上圖中的滑鼠,鍵盤,螢幕你應該都不陌生吧,還有右邊那個大傢伙: 主機箱。

我們關心的是主機箱,因為我們的記憶體在這裡面。

1783214-815036501b420405.jpg
主機箱

當然,我們的硬碟,暫存器和高度快取也都在這個主機箱裡。

我們來開蓋看看裡面的內容吧:

1783214-81db25c6aa69adb4.jpg
主機箱內部

看上去有點凌亂,不過不用擔心,我們並不需要知道各部分的功能,我們只需要關心我們這一章的主角: 記憶體。

它在哪呢?細心的讀者可能發現了,我用紅色框標識的那個區域就是記憶體所在。

我並沒有標出其他兩種儲存器:快取記憶體和暫存器,因為它們實在太小了,不容易看到。

下圖就是記憶體條的樣子:

1783214-62fcd81a1b70b491.JPG
記憶體條

記憶體也經常被稱為RAM,是Random Access Memory(隨機存取儲存器)的縮寫。所以之後的課程我們有時也會用RAM來稱呼記憶體。

記憶體圖示

從外觀上,即使我們用顯微鏡來看記憶體條,也看不出個所以然來。我們關心的是它內部的運作機制。

下面是一張記憶體機制的圖示:

1783214-171806e58939c2ec.jpg
記憶體機制

很精簡是吧,因為我們不需要知道太多細節。不然我們可能會被告知:“你,你知道得太多了。” 然後…就沒有然後了→_→

如果你能搞清楚上圖,暫時也已經足夠啦。

如你所見,上圖中我們關心兩列:

  • 左邊一列是地址: 記憶體地址是一個數,能夠讓電腦在記憶體裡定位, 地址從0開始,到3448765900126結束。這裡只是舉個例子,我並不知道這個記憶體裡有多少地址(不一定是到3448765900126結束),每個記憶體條的容量是不同的。一般來說,記憶體條容量越大(有些電腦目前有16G記憶體,或更多),地址數就越多,儲存的資訊也越多。

  • 右邊一列是值(數字): 每一個記憶體地址都儲存一個數值,以便電腦之後使用,而且每個地址只能儲存一個值。

我們的記憶體只能儲存數字。

那你要問了,記憶體裡怎麼儲存一個單詞呢?

好問題。事實上,對於電腦來說,字母也是以數字的形式呈現。一句話就是一連串的數字。
有一張表儲存了數字和字母的對應關係,這張表被稱為“ASCII碼錶”。舉個例子,數字67對應大寫的字母Y。

我們暫時不深究ASCII碼錶,之後的課程會再次提到。

所以上圖其實不難理解,如果我們要在記憶體中儲存一個數,比如5,記憶體會看看哪個地址是可用的,然後在裡面(比如地址 35487412)儲存5;之後記憶體再要取這個數值的時候,就直接去訪問35487412這個地址,得到裡面的數,是5

大體上記憶體的機制就是這樣,暫時還是有點模糊的,但在之後的章節,會越來越清晰,我向你保證。

今天的課就到這裡,一起加油吧。

下回預告

C語言探索之旅 | 第一部分第四課第二章:變數的世界之變數宣告

下一課我們繼續探尋C語言變數的奇幻世界。

相關文章