關於修飾詞const

2021-09-30 12:19:04 字數 1861 閱讀 3922

1. const修飾的唯讀變數必須在定義的同時初始化;

因為如果沒有被賦初值,那麼變數被編譯器分配了乙個空間,並且賦給預設的乙個值,一般是很大的乙個負數,當我們再次給這個const變數賦值的時候就會出現錯誤,這個變數是唯讀的,一旦被賦值了就不能再改變了。

2. case後面不可以是const修飾的唯讀變數,因為case之後只能是常量;

3. 函式的引數中的有const關鍵字,例如:

void fun(const int *a, const int *b)

這個引數不是定義,是宣告而已,函式在呼叫的時候傳遞引數,同時給const變數賦值,這個過程是乙個整體,而不是分化。另外,const告訴編譯器,a,b的值在函式體內不能被改變。宣告除了函式的引數外,還有一種關於const變數的宣告:extern const int a;注意這裡只是宣告,而不是定義。

4. const和define的區別:const效率更高;

const變數在編譯期間,編譯器通常不為它分配記憶體空間,而是將他們儲存在符號表中,例如:

#define len 3  //巨集常量

const int max = 5; //此時並未將max放入記憶體中

....

int i = max; //此時為max分配記憶體,以後不再分配

int j = len; //預編譯期間進行巨集替換,為len分配記憶體

int k = max; //不再為max分配記憶體

int m = len; //再次進行巨集替換,又一次為len分配記憶體

5. const修飾的位置不同意義也不同:

(1)修飾一般簡單唯讀變數:

a. const int i = 2;等同於int const i = 2;

b. const int a[2] = ;等同於int const a[2] = ;

(2)修飾指標變數:

a. const int *p; // p可以變,p指向的物件不可變;

b. int const *p; // p可以變,p指向的物件不可變;

c. int *const p; // p不可以變,p指向的物件可以變;

d. const int *const p; //指標p和p指向的物件都不可以變;

6. 修飾函式返回值:

例如:const int fun(void);表示函式的返回值是不能被改變的,函式是乙個唯讀函式。

拓展:有關const的幾個疑問,從網上找了相關的答案,高人指點的很好,學習一下:

1.儲存位置:對於乙個const型別的區域性變數,真的是分配在「唯讀資料段」?還是和普通區域性變數一樣在棧上分配記憶體?

解答:唯讀資料段僅是實現的其中一種方式,目的是在執行時令試圖修改const變數的行為產生錯誤。由於c標準並沒有禁止對const變數的修改,而是規定屬於未定義行為,因此乙個實現對於試圖修改const的行為如何處理都沒有違反標準,也就是說,無論把const變數放在唯讀段也好,放在可被修改的地方也好(例如你說的棧),都是允許的行為。

2.生命週期:「唯讀資料段」,是和靜態變數一樣程式執行前就分配好記憶體,程式退出時才釋放記憶體,生命週期是整個程式執行時間?

解答:no,唯讀資料段與生命週期無關。

3.對於乙個const型別的區域性變數,如const int a=1;1這個值是在編譯期間就確定的,還是到執行時才確定的?

解答:這要分抽象語義和實現語義,對於抽象語義,a必定是執行時才確定的,抽象語義才是a的本質;而對於乙個實現,如果確定**的其它地方並沒有使用a的執行期資訊,例如沒有使用a的位址等,編譯器也可以選擇將a的值隱式作為字面值處理,即是說,編譯器在實現a的語義時可以靈活處理,只要能表現出a的抽象語義即可。

4.問題1,3對於const型別的全域性變數呢?

解答:問題1的處理是一樣的,但全域性變數不可能在棧中。而對於問題3,全域性變數的值在編譯期是確定的。

C語言修飾詞之const

const是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性,另外,在 別人 的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。另外const在其他程式語言中也有出現,如c php5 c net hc08 c。c中const的使...

關於protected修飾詞的思考

先貼出protected的訪問區間 同一包內或者在其子類中訪問。雖然很簡單的話但是對於乙個初學者來說似乎會存在一些誤解 沒有細細考究之前我也是如此 而這個誤解在 呢,先看幾行簡單的再不能簡單的 package tesst public class test1 package tesst public...

ios修飾詞總結

ios總共有這些修飾詞 assign weak strong retain copy nonatomic atomic readonly readwrite assign arc mrc weak arc 物件 弱指標是針對物件的修飾詞 就是說它不能修飾基本資料型別 int float weak 修...