C語言中的CONST使用

2021-03-31 08:56:31 字數 3046 閱讀 1288

c中的const使用

const是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。

const的使用是c語言中乙個比較微妙的地方,請看下面幾個問題。

問題:const變數 和 常量

為什麼下面的例子在使用乙個const變數來初始化陣列,ansi c的編譯器會報告乙個錯誤呢? 

const int n = 5;

int a[n];

答案與分析:

1)這個問題討論的是「常量」與「唯讀變數」的區別。常量肯定是唯讀的,例如5, 「abc」,等,肯定是唯讀的,因為常量是被編譯器放在記憶體中的唯讀區域,當然也就不能夠去修改它。而「唯讀變數」則是在記憶體中開闢乙個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。

c語言關鍵字const就是用來限定乙個變數不允許被改變的修飾符(qualifier)。上述**中變數n被修飾為唯讀變數,可惜再怎麼修飾也不是常量。而ansi c規定陣列定義時長度必須是「常量」,「唯讀變數」也是不可以的。

2) 注意:在ansi c中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而const int n,n只是乙個變數(常量 != 不可變的變數,但在標準c++中,這樣定義的是乙個常量,這種寫法是對的),實際上,根據編譯過程及記憶體分配來看,這種用法本來就應該是合理的,只是 ansi c對陣列的規定限制了它。

3) 那麼,在ansi c 語言中用什麼來定義常量呢?答案是enum型別#define巨集,這兩個都可以用來定義常量。

問題:const變數 和 const 限定的內容

下面的**編譯器會報乙個錯誤,請問,哪乙個語句是錯誤的呢? 

typedef char * pstr;

char string[4] = "abc";

const char *p1 = string;

const pstr p2 = string;

p1++;

p2++;

答案與分析:

問題出在p2++上。

1) const使用的基本形式: const char m;

限定m不可變。

2) 替換1式中的m, const char *pm;

限定*pm不可變,當然pm是可變的,因此問題中p1++是對的。

3) 替換1式char, const newtype m;

限定m不可變,問題中的charptr就是一種新型別,因此問題中p2不可變,p2++是錯誤的。

問題:const變數 和 字串常量

請問下面的**有什麼問題?

char *p = "i'm hungry!";

p[0]= 'i';

答案與分析:

上面的**可能會造成記憶體的非法寫操作。分析如下, 「i'm hungry」實質上是字串常量,而常量往往被編譯器放在唯讀的記憶體區,不可寫。p初始指向這個唯讀的記憶體區,而p[0] = 'i'則企圖去寫這個地方,編譯器當然不會答應。

問題:const變數 和 字串常量2

請問char a[3] = "abc" 合法嗎?使用它有什麼隱患?

答案與分析:

在標準c中這是合法的,但是它的生存環境非常狹小;它定義乙個大小為3的陣列,初始化為「abc」,但它沒有通常的字串終止符'\0',因此這個陣列只是看起來像c語言中的字串,實質上卻不是,因此所有對字串進行處理的函式,比如strcpy、printf等,都不能夠被使用在這個假字串上。

問題5:const 和 指標

型別宣告中const用來修飾乙個常量,有如下兩種寫法,那麼,請問,下面分別用const限定不可變的內容是什麼?

1) const在前面

const int nvalue; //nvalue是const

const char *pcontent; //*pcontent是const, pcontent可變

const (char *) pcontent; //pcontent是const,*pcontent可變

char* const pcontent; //pcontent是const,*pcontent可變

const char* const pcontent; //pcontent和*pcontent都是const

2) const在後面,與上面的宣告對等

int const nvalue; // nvalue是const

char const * pcontent;// *pcontent是const, pcontent可變

(char *) const pcontent;//pcontent是const, *pcontent可變

char* const pcontent;// pcontent是const, *pcontent可變

char const* const pcontent;// pcontent和*pcontent都是const

答案與分析:

const和指標一起使用是c語言中乙個很常見的困惑之處,在實際開發中,特別是在看別人**的時候,常常會因為這樣而不好判斷作者的意圖,下面介紹一種有效的判斷原則:

a、  當有「()」的出現時,比如

const (char *) pcontent;

此時,(char *)是乙個整體,相當於乙個新型別,因此,這時限定指標為const。

b、其它情況時

l          沿著*號劃一條線,如果const位於*的左側,則const就是用來修飾指標所指向的變數,即指標所指的為常量

l如果const位於*的右側,const就是修飾指標本身,即指標本身是常量。

C語言中const的使用

const and pass by value 使用乙個常量字首 const 可以避免傳址變數的修改 void f const string s 一些開發者即使針對傳值變數也用 const void f const int n n is passed by value,why const?const...

C語言中const的使用

可以使用const關鍵字對變數加以限定 const int maxnum 100 班級的最大人數 這樣 maxnum 的值就不能被修改了,任何對 maxnum 賦值的行為都將引發錯誤 maxnum 90 錯誤,試圖向 const 變數寫入資料 我們經常將 const 變數稱為常量 constant ...

c語言中關於const的使用

const是c語言中乙個十分重要的修飾 我總結了它的含義使用以及作用如下 1.修飾的資料型別是常型別,常型別的變數或物件的值不能被改變 const int i 10 int a i 等價於int a 10 2.便於進行型別檢查,使編譯對處理內容有更多的了解,消除了一些隱患。3.方便的進行引數的調整和...