標籤:
const關鍵字在C代碼中很常見,下面總結一下其作用:
1、將一個變數聲明為常量,即唯讀。這一點跟#define 是相似的,如: const int a;
這時候,a就被視為一個常量,具有不可修改的性質。這個聲明的問題是沒有對a初始化,編譯器給a分配的空間,以前是什麼值,預設就是什麼值,所以以後要給a賦值會報錯。
恰當的聲明應該是這樣的: const int a = 3;
即,聲明的同時進行初始化。需要注意的是,int const a = 3; 效果是一樣的,在這種情形下,const和資料類型的位置可以顛倒。
2、修飾指標變數
稍微介紹一下指標。指標就是地址,而所謂地址,就是一串數字,但是這個數字卻標示了記憶體中的一個儲存單元。要知道記憶體中的每個儲存單元都是有編號的。當然,儲存單元裡面存放的內容本質上也是一串數字,但必須搞清楚,儲存單元的編號和內容不是一回事,或者說沒有什麼關係,因為它們的解讀方式不同。
由於表示地址的數字太長,不容易記憶,所以C語言使用了變數名稱來代替這個數字。可以知道,在編譯階段,每個變數名稱都是要最終替換成某個“數字地址”的,也就是說,變數名和某個儲存單元的地址是綁定的、對應的。
先看第一種情況: int *const a; 那麼a是一個變數,存放一個指標類型的資料,即地址值。這個地址值所代表的儲存單元存放一個int型資料。現在a被const修飾了,於是有些東西不能修改了。那麼到底是a中存放的那個地址不能修改還是這個地址對應的儲存單元裡面的資料不能改?答案是前者,即a中存放的只能是某個地址,不能改,只與這個地址中存放什麼值無所謂,隨便改。用代碼錶示的話,a不能再賦予其他地址值,但是 *a 可以隨便賦值。a 和 *a 分別代表什麼大家都很清楚。
第二種情況:const int *a; 這個時候,不能改的不是a中的那個地址值,而是這個特定的地址中的內容不能改,與上一種情況正好相反。於是,a可以再賦予其他地址值,但是a的值沒有改變之前,*a 是不能改變的。(註:int const *a和這種聲明效果一樣,所以本質區別是*號挨著變數還是const)
第三種情況:const int *const a; 顯然,誰都變不了了。
3、修飾函數形參
這種經常見於函數的形參是數組或指標的情況,為了防止函數修改傳遞過來的數組內容或指標內容(2中的第二種情況)被意外修改,於是加上const限定,如:int FindNum(const int array[], int num, int conut);
4、待補充。
C語言之const關鍵字