天天看點

C語言學習及應用筆記之三:C語言const關鍵字及其使用

  在C語言程式中,const關鍵字也是經常會用到的一個關鍵字,那麼使用const關鍵字的目的是什麼呢?事實上,在程式中使用const關鍵字的主要目的就是為了向使用者傳遞設計者的一些意圖。

  事實上,無論我們是使用const關鍵字聲明變量還是聲明參數,其目的都是為了告訴使用者這個變量或者參數的應用目的。合理地使用關鍵字const 可以使編譯器有效地保護那些不希望被改變的變量或參數,防止其無意中被代碼修改。是以使用const關鍵字可以避免一些不必要的錯誤。

  我們已經說明了const關鍵字的作用,接下來我們将更進一步讨論const關鍵字使用:

(1)const關鍵字修飾的變量

   const關鍵字最常見的用法就是修飾變量,使用const關鍵字修飾的變量可以認為有隻讀屬性。如:

  const int a=10;

  int b=0;

  b=a;  (I)這條語句是正确的

  a=b;  (II)這條語句是錯誤的,編譯錯誤,因為a具有隻讀屬性

  雖然const關鍵字修飾的變量具有隻讀屬性,但絕不能将它簡單的等價于常量。事實上C語言的const關鍵字修飾的變量僅是文法上的常量。

  此外,使用const關鍵字修飾的變量,在聲明時必須進行初始化。這是顯而易見的,既然是隻讀的,當然就得有一可供兌取的明确的值,而不是不确定的。例如:

  const int a=10;    //合法用法

  const int a;      //非法,導緻編譯錯誤

  另外需要注意的是,使用const關鍵字定義的變量是全局性的。是以在使用的時候需要注意。

  通常使用define定義一個宏,如:#define PI 3.1415976,以後無論在哪裡需要使用圓周率時,我們直接使用PI即可,而在編譯時預處理器會将所有的PI替換為3.1415976。這很友善,但是由于編譯器不會對其進行檢查,如果使用不慎就會引入錯誤,而且此種錯誤很難發現。而且,我們也無法得到PI的位址,不能向PI傳遞指針或引用。

  為此,我們常使用const關鍵字修飾的變量來代替宏。使用const聲明的變量雖然增加了配置設定空間,但是可以保證類型安全,并且可以得到其指針。const消除了預處理器的值替代的不良影響,并且提供了良好的類型檢查形式和安全性,是以了解了const關鍵字,對我們的程式設計是有很大的幫助的。

(2)const關鍵字修飾的指針變量

  const關鍵字除了用來修飾普通變量外,還經常用來修飾指針變量。當然,在讨論之前,我們需要搞清楚兩個概念:常量指針和指向常量的指針。所謂常量指針就是指針變量的值一旦初始化就不能改變,是以必須初始化。而所謂指向常量的指針就是其指向的值是一個常量的指針。

  在聲明指針變量時,const關鍵字所處的位置,決定了其定義的指針變量的含義,例如我們定義:

  (a)int * const p; 該語句表示指向整形的常量指針 ,它不能在指向别的變量,但指向(變量)的值可以修改。

  (b)const int * p; 該語句表示指向整形常量 的指針,它指向的值不能修改。

  (c)int const * p; 該語句與b的含義相同,表示指向整形常量 的指針,它指向的值不能修改。

  (d)const int *const p; 該語句表示指向整形常量 的常量指針 。它既不能再指向别的常量,指向的值也不能修改。

  (e)int const *const p; 該語句與d的含義相同,表示指向整形常量 的常量指針 。它既不能再指向别的常量,指向的值也不能修改。

  這寫定義容易讓人糊塗,但有一點技巧可以幫助我們了解。就是看const關鍵字的右邊跟着的是什麼?當const關鍵字的右邊是類型時,則表示值是常量;當const關鍵字的右邊是指針變量,則表示指針本身是常量。

(3)const關鍵字修飾的函數形參

  const關鍵字也經常用來修飾函數的形參。關鍵字const修飾函數形參時,通常用于參數為指針或引用的情況,且隻能修飾輸入參數。若輸入參數采用“值傳遞”方式,由于函數将自動産生臨時變量用于複制該參數,該參數本就不需要保護,是以不用const修飾。

  const關鍵字修飾函數輸入參數的形式如:void function(const  int * a ); 或者void function(const  int & a);都是可以的。在C标準庫中就很多這樣的應用,例如字元串處理函數:

  字元串拷貝函數:char *strcpy(char *strDest,const char *strSrc);

  傳回字元串長度函數:int strlen(const char *str);

  以上兩個函數就是将源字元串使用const關鍵字保護起來,防止不注意的修改改變了源字元串的值。

  佷顯然,采用const關鍵字修飾函數形參,就是為了保護輸入參數。在調用函數的時候,用相應的變量初始化const常量,則在函數體中,按照const所修飾的部分進行常量化,如形參為const int * a,則不能對傳遞進來的指針所指向的内容進行改變,保護了原指針所指向的内容;如形參為const int & a,則不能對傳遞進來的引用對象進行改變,保護了原對象的屬性。

(4)const關鍵字修飾的函數傳回值

  const關鍵字有時候也會用來修飾函數的傳回值,這種情況一般是用來修飾傳回的指針或引用,保護指針指向的内容或引用的内容不被修改。例如:

  const char * function(void);

  這種用法比較少見,在此僅提及一下。

  綜上所述,const關鍵字不但強大,而且對我們的程式設計确實有很大的幫助,前提是我們真正的了解了它的用法。

歡迎關注:

如果您希望更友善且及時的閱讀相關文章,關注我的微信公衆号【木南創智】

繼續閱讀