做者 謝恩銘,公衆號「程序員聯盟」。 轉載請註明出處。 原文:www.jianshu.com/p/e2954324e…git
《C語言探索之旅》全系列程序員
通過上一課 C語言探索之旅 | 第一部分第三課:你的第一個程序 ,咱們已經知道怎麼在屏幕上顯示文字了。github
暫時咱們也就只能作這麼多了。而這是正常的,由於咱們還沒學習很重要的編程知識:變量。編程
變量相關的知識點比較多,咱們會分爲幾課來學習:緩存
這一課咱們學習電腦內存的知識。dom
每個正常人都有記憶,咱們的老朋友電腦也不例外,只不過它比咱們「厲害」,它的記憶(存儲器)有好幾種。學習
爲何電腦要有好幾種存儲器呢?單單一種還不夠嗎?3d
不夠:主要問題是咱們想要電腦有一個既快捷(可以很快提取信息)又容量大(可以存儲不少數據)的存儲器。code
然而,你會啞然失笑,由於目前咱們尚未一種兼具快捷和大容量兩種特性的存儲器。更準確地說,高速存儲器太貴,因此容量只能低一點。cdn
所以,咱們只能給電腦配備:
如下列出電腦的存儲器類型,從速度最快到速度最慢排序:
寄存器(Register):位於處理器(Processor)上,存取速度很是快(由於「近水樓臺先得月」)。
高速緩存(Cache):用於連接寄存器和內存。
內存(Memory):這是咱們編程時最常打交道的存儲器,也是平時咱們買電腦時很關心的數據之一。
硬盤(Hard Disk):你確定不陌生,就是平時 Windows 電腦裏的 C 盤,D 盤之類的(固然還有不少其餘類型的硬盤,好比 U 盤,EEPROM,等),咱們在裏面存儲文件,照片,視頻,等。
正如上面所說,咱們這裏把存儲器從最快(寄存器)到最慢(硬盤)作了分類。你應該能夠推斷出寄存器相比硬盤來講,容量要小不少。
寄存器只能存儲少許的數據,而硬盤則能夠存儲大量的數據。
當咱們說一個存儲器慢的時候,實際上是相對電腦的處理速度而言的。
讀取硬盤大概要耗費 8 毫秒,對於一臺電腦來講那已經很慢了(如今普通的家用電腦的運算速度都已經能夠達到每秒幾十億次了,1 GHz 對應每秒 10 億次;若是你的電腦主頻是 2.5 GHz,那運算速度就是每秒 25 億次;如今家用的雙核電腦一般都能達到每秒 50 億次運算(5 GHz)左右的水平)。
上面所說的內容,咱們須要掌握什麼呢?
事實上,只須要關心一部分就夠了。要知道在編程時,咱們基本上只和內存打交道。咱們在以後的課程中也會學習如何讀寫硬盤,在硬盤上建立文件。至於寄存器和高速緩存,咱們基本不關心,這是電腦的事。
固然,在一些很底層的語言中,好比彙編語言(Assembly,簡稱 ASM),咱們常常會用到寄存器。
我之前學生時代跟着王爽老師的《彙編語言》第二版學習了彙編,那本書寫得挺好。
可是我想說的是,用匯編哪怕只是作個乘法,也是很不容易的。幸運的是,在 C語言(或其餘大部分語言)中作乘法很簡單。
還要記住一個很重要的知識點:上述四種存儲器類型中,只有硬盤是能夠永久保存數據的。其餘的存儲器(寄存器,高速緩存,內存)都是暫時性的存儲器:當你關閉電腦時,這些存儲器會被清空。
幸虧,當你從新開啓電腦時,硬盤裏的數據始終存在,因此你的電腦還知道本身姓甚名誰。
既然咱們之後的大部分時間都要跟內存打交道,那豈能不來認識認識這位朋友呢?
咱們用變焦鏡頭的形式慢慢道來。
一開始看到的是咱們的電腦工做環境的總體圖片:
上圖中的鼠標,鍵盤,顯示屏,你應該都不陌生吧,還有右邊那個你們夥:主機箱。
咱們關心的是主機箱,由於咱們的內存在這裏面。
固然,咱們的硬盤,寄存器和高度緩存也都在這個主機箱裏。
咱們來開蓋看看裏面的內容吧:
看上去有點凌亂,不過不用擔憂,咱們並不須要知道各部分的功能,咱們只須要關心咱們這一章的主角:內存。
它在哪呢?聰明如你可能已經發現了,我用紅色框標識的那個區域就是內存所在。
我並無標出其餘兩種存儲器:高速緩存和寄存器,由於它們實在過小了,不容易看到。
下圖就是內存條的樣子:
內存也常常被稱爲 RAM,是 Random Access Memory(隨機存取存儲器)的縮寫。因此以後的課程咱們有時也會用 RAM 來稱呼內存。
從外觀上,即便咱們用顯微鏡來看內存條,也看不出個因此然來。咱們關心的是它內部的運做機制。
下面是一張內存機制的圖示:
很精簡是吧,由於咱們不須要知道太多細節。否則咱們可能會被告知:「你,你知道得太多了」。而後… 就沒有而後了...
若是你能瞭解清楚上圖,暫時也已經足夠了。
如你所見,上圖中咱們關心兩列:
左邊一列是地址: 內存地址是一個數,可以讓電腦在內存裏定位, 地址從 0 開始,到 3448765900126 結束。這裏只是舉個例子,我並不知道這個內存裏有多少地址(不必定是到 3448765900126 結束),每一個內存條的容量是不一樣的。通常來講,內存條容量越大,地址數就越多,儲存的信息也越多。
右邊一列是值(數字): 每個內存地址都儲存一個數值,以便電腦以後使用,並且每一個地址只能存儲一個值。
咱們的內存只能存儲數字。
那你要問了,內存裏怎麼存儲一個英語單詞呢?
好問題。事實上,對於電腦來講,字母也是以數字的形式呈現。一句話就是一連串的數字。
有一張表儲存了數字和字母的對應關係,這張表被稱爲「ASCII 碼錶」。舉個例子,數字 67 對應大寫的字母 C。
咱們暫時不深究 ASCII 碼錶,以後的課程會再次提到。
因此上圖其實不難理解,若是咱們要在內存中儲存一個數,好比 5,內存會看看哪一個地址是可用的,而後在裏面(好比地址 35487412)儲存 5;以後內存再要取這個數值的時候,就直接去訪問 35487412 這個地址,獲得裏面的數,是 5。
大致上內存的機制就是這樣,暫時仍是有點模糊的,但在以後的章節,會愈來愈清晰,我向你保證。
今天的課就到這裏,一塊兒加油吧!
下一課:C語言探索之旅 | 第一部分第五課:變量的世界(二),變量聲明
下一課咱們繼續探尋 C語言變量的奇幻世界。
我是 謝恩銘,公衆號「程序員聯盟」運營者,慕課網精英講師 Oscar 老師,終生學習者。 熱愛生活,喜歡游泳,略懂烹飪。 人生格言:「向着標杆直跑」