那麼到底什麼是變數?看看下面這個程式:
# include <stdio.h>
int main(void)
{
int i;
i = 3;
printf("i = %dn", i);
return 0;
}
在上面這個程式中,首先定義了一個變數 i,然後把 3 放到 i 裡,接著輸出 i。
關鍵看前兩句,第三句 printf 的用法非常複雜,功能非常強大。但是因為其用法太靈活了,所以很容易出錯。在後面會專門用一章的內容詳細地介紹 printf,這裡先不講。
int i;
表示定義了一個變數 i。那麼程式在執行時定義的變數 i 儲存在什麼地方呢?儲存在記憶體還是硬碟上?答案是儲存在記憶體。
當單擊編譯、連結、執行後彈出一個黑色視窗,關閉那個黑色視窗後,就意味著這個程式執行了一遍,而且這一遍已經終止了。此時儲存 3 的記憶體空間就沒有了,要是有的話就麻煩了!如果任何軟體執行一遍後為它分配的空間仍保留著,那麼計算機再執行幾次就不行了。程式執行完之後,為這個程式所分配的所有記憶體空間通通都會被釋放掉,以便被下一個程式使用。
所謂“釋放”並不是指清空該記憶體空間,而是指將該記憶體空間標記為“可用”狀態,使得系統在分配記憶體的時候可以將它重新分配給其他變數使用。
如果沒有釋放的話系統在分配記憶體的時候是不會使用該記憶體空間的,因為它已經被別的變數使用了,是不可用的狀態。“釋放”這個詞後面會經常說到,大家要注意一下。
下面看看這兩條語句是怎麼執行的。首先看程式是如何執行
int i;
的:當編譯器執行第一條語句的時候,它會請求作業系統在記憶體中尋找一個空閒的儲存單元,然後把它當作變數 i 來使用。也就是說這個儲存單元的地址和 i 產生了一種關聯。即變數 i 現在就是這個儲存單元,這個儲存單元現在就是變數 i。
然後
i=3;
的結果是把 3 存放到變數 i 所關聯的那個儲存單元中。
前兩條語句就是這麼執行的。以後只要使用 i,作業系統就會自動找到那個與它關聯的儲存單元。
為什麼要使用變數
為什麼要使用變數?如果不使用變數的話,那就意味著我們要自己程式設計尋找記憶體裡面的那個儲存單元。而記憶體裡面有很多儲存單元,每個儲存單元都有一個編號。如果須記住這些編號的話就太麻煩了。假如要定義 100 個變數,那就要記住 100 個編號,這樣程式設計是不可能實現的。
而利用變數就可以很方便地解決這個問題!當定義了一個變數之後,此時變數對應的是哪個儲存單元,那個儲存單元的編號是什麼,通通都不用我們考慮,系統內部會自動產生一一對應的關係。這樣就方便了對資料的儲存和對記憶體單元的操作。