李洪強iOS開之【零基礎學習iOS開發】【02-C語言】04-常量、變數

來源:互聯網
上載者:User

標籤:

在我們使用電腦的過程中,會接觸到各種各樣的資料,有文檔資料、圖片資料、視頻資料,還有聊QQ時產生的文字資料、用迅雷下載的檔案資料等。這講我們就來介紹C語言中資料的處理。

一、資料的儲存1.資料類型

首先來看看電腦是怎麼儲存資料的。總的來說,電腦中儲存的資料可以分為兩種:待用資料和動態資料。

1> 待用資料

概念:待用資料是指一些永久性的資料,一般儲存在硬碟中。硬碟的儲存空間一般都比較大,現在普通電腦的硬碟都有500G左右,因此硬碟中可以存放一些比較大的檔案。

儲存的時間長度:電腦關閉之後再開啟,這些資料依舊還在,只要你不主動刪掉或者硬碟沒壞,這些資料永遠都在。

哪些是待用資料:待用資料一般是以檔案的形式儲存在硬碟上,比如文檔、照片、視頻等。

 

2> 動態資料

概念:動態資料指在程式運行過程中,動態產生的臨時資料,一般儲存在記憶體中。記憶體的儲存空間一般都比較小,現在普通電腦的記憶體只有4G左右,因此要謹慎使用記憶體,不要佔用太多的記憶體空間。

儲存的時間長度:電腦關閉之後,這些臨時資料就會被清除。

哪些是動態資料:當運行某個程式(軟體)時,整個程式就會被載入到記憶體中,在程式運行過程中,會產生各種各樣的臨時資料,這些臨時資料都是儲存在記憶體中的。當程式停止運行或者電腦被強制關閉時,這個程式產生的所有臨時資料都會被清除。

你可能會問:既然硬碟的儲存空間這麼大,為何不把所有的應用程式載入到硬碟中去執行呢?有個主要原因是記憶體的訪問速度比硬碟快N倍。

 

3> 動態資料和待用資料的轉換

硬碟和記憶體是電腦使用最頻繁的兩個硬體,它們之間的資料經常要進行轉換。

比如,硬碟上有個叫做“C語言.mp4”的視頻檔案,現在要使用暴風影音來播放

首先開啟暴風影音軟體,電腦會將暴風影音載入到記憶體中,緊接著電腦會讀取硬碟中視頻檔案的內容到記憶體中。暴風影音會解析讀取到的檔案內容,以視頻的形式呈現給使用者看。這就完成了一個由待用資料到動態資料的轉換。

 

再比如,你使用迅雷從網上下載一個叫做“C語言.mp4”的視頻檔案

首先開啟迅雷軟體,電腦會將迅雷載入到記憶體中,緊接著迅雷就會從互連網下載視頻檔案。大家都知道,這個下載過程肯定是要耗點時間的,主要受檔案大小和下載速度的影響。每個時間段內下載擷取的資料都是先放到記憶體中,然後再寫入到硬碟中。所有資料下載完畢後,硬碟中就會有一個完整的視頻檔案。這就完成了動態資料到待用資料的轉換。

 

2.儲存形式1> 二進位儲存

 在前面的文章中說過,電腦只能識別0和1。因此,前面所說的待用資料和動態資料,都是以0和1的形式儲存的,這種儲存方式稱為“二進位儲存”。有人可能覺得很詫異,只是0和1怎麼可能表示這多的資料呢?沒錯,如果只是一位元字的話,只能表示2種資料:要麼是0,要麼是1。但是如果有多位元字的話,那情況就不一樣了。如果有2位元字,那麼就能表示4種資料:00、01、10、11;如果有3位元字呢,就能表示8種資料;以此類推,如果有n位元字,就能表示2的n次方種資料。可以發現,只要位元足夠,0和1所能表示的資料是非常龐大的。

 

2> 位元位和位元組

* 平時我們在電腦上看到的MP4、MP3、照片等檔案,都是由0和1組合成的,只不過電腦解析了這些0和1,以圖形介面的形式呈現在我們眼前。檔案越大,所包含的0和1就越多,為了方便計算檔案大小,對計量單位做了個規定:1個二進位位為1bit,也就是1個0或1就為1bit,bit的中文翻譯是“位元位”;8個二進位位為1byte,也就是8個0或1就為1byte,1byte=8bit,byte的中文翻譯是“位元組”。平時我們所說的某個檔案大小為64B,就是64位元組的意思,內部包含了64x8個0和1。

* 還有一些需要瞭解的計量單位:

1 KB = 1024 B,1 MB = 1024 KB,1 GB = 1024 MB,1 TB = 1024 GB

* 在Mac上查看某個mp4檔案的大小:

26.2 MB = 26.2 x 1024 KB = 26.2 x 1024 x 1024 B(位元組)

 

二、資料類型

作為程式員,最關心的肯定是記憶體中的動態資料,因為我們寫的程式就是運行在記憶體中的。程式在運行過程中,會產生各種各樣的動態臨時資料,為了方便資料的運算和操作,C語言對這些資料進行了分類,提供了豐富的資料類型。大致如所示:

* 在圖中眾多資料類型中,最常用的是4種基礎資料型別 (Elementary Data Type):char、int、float、double,而最重要的是指標類型,指標使用得當的話,不僅可以節省代碼量,還可以最佳化記憶體管理、提高效能。因此,指標是一個非常重要的概念,必須重視。如果你說C語言中除了指標,其他都學得挺好的,那你乾脆說你沒學過C語言。

* 這些豐富的資料在C語言中可以用常量或者變數來表示。接下來就介紹一下常量和變數的使用。

 

三、常量1.什麼是常量

"量"表示資料。常量,則表示一些固定的資料,也就是不能改變的資料。

 

2.常量的類型

在C語言中,常量大致可以分為以下類型:

1> 整型常量(int)

其實就是int類型的資料,包括了所有的整數,比如6、27、109、256、-10、0、-289等

 

2> 浮點型常量(float\double)

浮點型常量分為double和float兩種資料類型

  • double:雙精確度浮點型,其實就是小數。比如5.43、-2.3、0.0等,注意,0.0也算是個小數。
  • float:單精確度浮點型,也是小數,比double的精確程度低,也就是說所能表示的小數位元比較少。為了跟double區分開來,float型資料都是以f結尾的,比如5.43f、-2.3f、0.0f。需要注意的是,絕對不能有10f這樣格式的,編譯器會直接報錯,只有小數才允許加上f。

 

3> 字元常量(char)
  • 將一個數字(0~9)、英文字母(a~z、A~Z)或者 其他符號(+、-、!、?等)用單引號括起來,這樣構成的就是字元常量。比如‘6‘、‘a‘、‘F‘、‘+‘、‘$‘等。
  • 注意:單引號只能括住1個字元,而且不能是中文字元,下面的寫法是錯誤的:‘abc‘、‘123456‘、‘男‘

 

4> 字串常量
  • 將一個或者多個字元用雙引號("")括起來,這樣構成的就是字串常量。比如"6"、"男"、"哇哈哈"、"abcd"、"my_car4",其實printf("Hello World");語句中的"Hello World"就是字串常量。
  • 那究竟6、‘6‘、"6"在用法上有什麼區別呢?這個先不作討論,以後會介紹。

 

三、變數1.什麼是變數

常量表示的資料是不可以改的,而用變數表示的資料是可以經常修改的。比如遊戲中主角的生命值就可以用一個變數來表示,主角受到傷害後,生命值就會減少,主角接受治療後,生命值就會增多,在遊戲過程中,主角的生命值一直都在改變,因此主角的生命值應該用一個變數來表示。總結一句話:當一個資料的值需要經常改變或者不確定時,就應該用變數來表示。

 

2.變數的定義

任何變數在使用之前,必須先進行定義。定義變數的目的是:在記憶體中分配一Block Storage空間給變數,方便以後儲存資料。如果定義了多個變數,就會為這多個變數分別分配不同的儲存空間。

1> 變數類型

* 電腦的記憶體是有限的,現在普通電腦的記憶體有4G,那麼定義一個變數的時候分配多少儲存空間給這個變數呢?是4G全部給它嗎?這很顯然不可能,如果把4G的儲存空間全部給了這個變數,那就意味著不能再分配空間給其他變數,而且系統也會癱瘓,因為記憶體不夠用了,無法再運行其他程式。因此,我們在定義變數的時候,需要指明變數類型,系統會根據變數類型來分配相應的儲存空間。不同資料類型所佔用的儲存空間是不一樣的,如果是字元型(char)變數,就分配1個位元組的儲存空間;如果是整型(int)變數,就分配4個位元組的儲存空間。

* 變數類型的還一個作用是用來約束變數所存放資料的類型。一旦給變數指明了類型,那麼這個變數就只能儲存這種類型的資料,比如整型(int)變數只能儲存整型資料,不能儲存浮點型資料。

 

2> 變數名

在程式運行過程,肯定會定義大量的變數,每個變數都有自己的儲存空間。那怎麼區分這些變數呢?怎麼找到變數對應的儲存空間呢?為了區分這些變數,定義變數的時候應該為每個變數指定一個變數名,變數名也是標識符的一種。當我們要修改變數的資料時,系統會根據變數名找到變數對應的儲存空間,將儲存空間裡面的資料改掉。

 

3> 定義

總結可得,定義變數需要2個條件:變數類型、變數名。定義變數的格式為:變數類型  變數名;

1 int main()2 {3     int i;4     5     char c;6     7     return 0;    8 }

由於C程式的入口是main函數,因此暫時把定義變數的代碼都寫在了main函數中。在第3行定義了一個名字為i的整型變數,說明i只能儲存整型資料;在第5行定義了一個名字為c的字元型變數,說明c只能儲存字元型資料。第3、5、7行的代碼都稱為“語句”,每條語句後面都有個分號;。

於是,系統就會在記憶體中分別為變數i、c分配一定的儲存空間,如所示,i和c各佔用一Block Storage空間。至於究竟佔用多少位元組的儲存空間呢,暫時不用去研究,後面會介紹。

 

如果是同一種類型的變數,可以連續定義,變數名之間用逗號,隔開。格式為:變數類型  變數名1, 變數名2, 變數名3, ... ;

1 int main()2 {3     int a, c;4     5     return 0;6 }

第3行代碼的意思是定義了2個int類型的變數,變數名分別為a、c

 

3.變數的使用1> 先定義,再初始化

前面已經定義了兩個變數,但是這兩個變數並沒有儲存任何值,我們需要給變數進行第一次賦值,也叫做“初始化”。

變數賦值的格式是:變數名 = 值;

這個等號"="是一個賦值運算子,將右邊的值賦值給左邊的變數,也就是將右邊的值儲存到左邊變數的儲存空間中。

 1 int main() 2 { 3     int i; 4     i = 10; 5      6     char c; 7     c = ‘A‘; 8      9     return 0;10 }

在第4行給變數i賦值一個整型常量10,在第7行給變數c賦值一個字元型常量‘A‘。像第4、7行這樣的賦值操作,稱為“賦值運算”。

記憶體中大致如所示,整數10儲存在i的儲存空間中,字母A儲存在c的儲存空間中。

(其實我這個圖並不是很準確,因為記憶體中的所有資料都是以0和1的形式儲存的,比如10,它會儲存成1010;字母A,它會儲存成1000001。這裡為了達到直觀的效果,就沒有寫成二進位形式)

 

2> 定義的同時初始化

上面的代碼也可以寫成下面這樣,在定義變數的同時進行初始化:變數類型  變數名 = 值;

1 int main()2 {3     int i = 10;4     5     float f = 10.9f;6     7     double d = 9.8;8     return 0;9 }

 

3> 可以不斷修改

既然i是個變數,說明它的值可以不斷地改變,看下面的代碼

 1 int main() 2 { 3     int i = 10; 4      5     i = 89; 6      7     char c = ‘A‘; 8      9     return 0;10 }

在第3行定義了變數i,並且初始值為10。緊接著在第5行把i的值改為89,這個89會覆蓋以前儲存的10,記憶體中大致如所示

 

4> const關鍵字

剛才提到,預設情況下,變數的值是可以不斷改變的。不過,有時候我們會希望變數的值只在定義的時候初始化一次,以後都不能再改變,這個時候我們就可以使用const關鍵字來修飾變數。

1 int main()2 {3     const int i = 10;4     5     i = 11;6     7     return 0;8 }

注意第3行,在int的前面加了個const關鍵字。表示變數i的值只會初始化一次,也就是說i的值永遠都是一開始的10,以後都不能再改了。所以編譯器會報第5行代碼的錯誤,不允許再次修改i的值。

 

4.變數的使用注意

1> 不能重複定義同一個變數

下面的代碼是錯誤的

1 int main()2 {3     int i = 10;4     5     int i = 89;6     return 0;7 }

編譯器會報第5行的錯,錯誤的原因很簡單,第3行和第5行都是定義變數i,因此在記憶體中會是這樣

記憶體中會出現兩Block Storage空間,而且名字都叫i,那如果我想取出變數i的值,那你說電腦取10好還是取89好呢?因此,這種做法肯定是不可以的。

 

2> 可以將一個變數的值賦值給另外一個變數

1 int main()2 {3     int i = 10;4     5     int a = i;6     7     return 0;8 }

在第3行定義了變數i且初始值為10;接著在第5行定義了變數a,並且將變數i的值賦值給了a。在記憶體中大致如所示:

變數i和變數a儲存的值都是10

 

3> 變數的作用範圍(範圍)是從定義變數的那一行代碼開始

下面的代碼是錯誤的

 1 int main() 2 { 3     int a = i; 4      5     int i = 10; 6      7     int b = i; 8      9     return 0;10 }

編譯器會報第3行的錯誤,錯誤原因是:標識符i找不到。我們是在第5行定義了變數i,因此變數i從第5行開始才有效,在前面的第3行是無效的。

 

  

李洪強iOS開之【零基礎學習iOS開發】【02-C語言】04-常量、變數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.