<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            C語言

            const的理解和用法

            時間:2025-01-17 01:44:41 海潔 C語言 我要投稿
            • 相關推薦

            const的理解和用法

              const是一個C語言(ANSI C)的關鍵字,具有著舉足輕重的地位。它限定一個變量不允許被改變,產生靜態作用。使用const在一定程度上可以提高程序的安全性和可靠性。下面是小編精心整理的const的理解和用法,希望對大家有所幫助。

              一、關于const的具體定義:

              ——個人感覺很難對它下一個標準的定義,因為的用法很靈活,似乎對它定義后總無法讓人能夠明白它的意思,而且容易讓人產生誤解(也許是偶水平太菜了)。例如,把它有定義:一個能夠讓變量變成無法修改的常量的關鍵字。那么,這樣的話,就可能讓人誤解為只要有const在定義變量里面,那變量就無論怎樣都無法修改。這樣的理解是很片面的(下面用法方面將對這問題做探討)。因此,本人在此不敢對它下定義,其他參考書好象也沒有下定義。

              二、關于const的具體作用

              ——const作用就靈活了,一個表達式中const放置的位置不同,效果可能就不一樣了。下面分具體情況分析(當然,所舉的情況并非覆蓋全部情況)

              A、const最經常的用法

              1.為了防止傳遞的函數參數不被修改,在調用函數的形參中用const關鍵字.

              //Example ->

              int FindNum(const int array[], int num, int conut);//聲明函數

              //code...

              int FindNum(const int array[], int num, int count)

              {

              int i;

              int flag = 1;

              for (i = 0; (i < count) && flag; i++)

              {

              if (array[i] == num)

              {

              flag = 0;

              break;

              }

              }

              return flag;

              }

              //code...

              上面這例子中,編譯器會把array[]當作常量數據的數組看待。所以,假如你不小心給數組賦值,那么,編譯器就會報錯了。因此,當你不需要也不想修改數組的數據時,最好用const把數組定義為常量數組。

              2.const可以用來創建數組常量、指針常量、指向常量的指針等:

              const char ch = a;

              const int a[5] = {1, 2, 3, 4, 5};

              const int *p = a; //a是一個數組的首地址.p是指向常量的指針

              int * const p = a; //a是一個數組的首地址.p是指針常量;

              const int * const p = a; //a是一個數組的首地址。p是指向常量的指針常量

              前兩種情況很簡單,現在著重分析一下后三種用法,因為這3種情況容易出錯,偶就有時候怕用錯了干脆不用const.

              ——const int *p = a;

              //p是指向常量的指針,因此,不可以通過給指針賦值來改變數組

              //中的數據,例如:

              // *p = 10;

              // *(p + 2) = 1;

              //假如指向常量指針可以改變值,那么,就等于也改變了數組的數

              //據了。假如你不理解,偶倒有一個辦法讓你理解,你就想你和一

              //個人綁在一起,有可能你移動了位置而他不跟著你移動嗎!哈哈

              ——int * const p = a;

              //看這表達式,const的位置和第一個不同吧!他們的用法和作用

              //就完全不一樣了。這時候p是指針常量,我們知道,指針是指向

              //了一個數組的首地址,那么,它的位置就不可以改變了。但是你

              //現在應該和第一個表達式比較了,現在的數組并不是常量數組,

              //所以數組的數據是可以改變的,而指針這時候它是不可以移動的

              //,指向數組第一個數據,所以它可以而且只可以改變數組第一個

              //數據的值。這一點請別誤解,指針常量只是它的地址不可以改變

              //,并不是它指向的內容一定不可以改變,這一點切記!

              //好啦。假如你又不理解,偶又有一個比較形象的例子來說明:

              //假如有一個固定的人拉著另外一個人的手,注意,固定的人相當

              //于他是不可以由其他人來替換的。但是他可以拉其他人的手啊,

              //并不一定規定他必須拉同一個人的手啊。現在你應該可以有個比

              //較深的印象和理解吧:P

              //下面舉幾個例子幫助理解:

              // *p = 2;

              // *(p+1) = 10;

              // p++;

              ——const int * const p = a;

              //假如前面兩種表達式的本質你理解了,這種表達式你來理解根本

              //沒有問題,const現在有兩個,而且一個const的位置是第一種情

              //況的位置,第二個const是第二種情況的位置,所以這表達式的功

              //能就是前兩種情況的作用總合。這里不多說!

              //下面舉幾個例子幫助理解:

              // *p = 2;

              // *(p + 2) = 10;

              // p++;

              B。const并不會阻止參數的修改

              之所以把這作為一點來談,就是因為有一些朋友可能會以為在函數參數中用了const就一定不可以改變

              參數,這實際上是錯誤的理解,因為,它并不阻止參數的修改,下面舉個簡單的例子來闡述一下;

              #include

              #include

              void ChangeStr(const char *String);

              int main(void)

              {

              char str[] = "The C programme";

              Change(str);

              printf(str);

              system("Pause");

              return 0;

              }

              void ChangeStr(const char *String)

              {

              char *Source = (char *)String;

              while (*Source)

              {

              *Source = toupper(*Source);

              Source++;

              }

              }

              //end

              上面的程序把字符串中的每個字符都轉換成大寫字母了。因為*String把地址給了*Source,而*Source的值的改變編譯器并不干涉,可能有的編譯器會發出警告之類。上面的程序只是為了說明const并不會阻止參數的修改,如果象上面程序那樣,個人感覺沒什么意義,只會讓人容易混亂而已。

              關于CONST的用法和理解本人也就只能說這么多了,當然,很可能有更多高級或者少用的用法,由于水平

              和經驗有限,確實不能再說些什么。

              一、C++中const的作用和用法

              不考慮類的情況:

              const常量在定義時必須初始化,之后無法修改

              const形參可以接收const和非const類型的實參

              考慮類的情況:

              const成員變量:不能在類定義外初始化,只能通過構造函數的初始化列表進行初始化

              const成員函數:const對象不可以調用非const成員函數;非const對象都可以調用,但不管怎么樣都不能夠修改非mutable修飾變量的值

              const 在編譯階段確定其值,它定義的常量占用靜態存儲區的空間,程序運行時只有一份,也可以進行調試

              優點:

              有數據存儲類型,在定義式可進行安全性檢查

              可調試

              占用較少的空間

              二、如何理解頂層const和底層const

              概念區分

              頂層const:指的是const修飾的變量本身是一個常量,無法修改,指的是指針,就是 * 號的右邊

              底層const:指的是const修飾的變量所指向的對象是一個常量,指的是所指變量,就是 * 號的左邊

              區分作用:

              執行對象拷貝時有限制,常量的底層const不能賦值給非常量的底層const

              使用命名的強制類型轉換函數const_cast時,只能改變運算對象的底層const

              三、說說const關鍵字的的作用有哪些?

              阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了

              對指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const

              在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值

              對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量,類的常對象只能訪問類的常成員函數

              對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”

              const成員函數可以訪問非const對象的非const數據成員、const數據成員,也可以訪問const對象內的所有數據成員

              非const成員函數可以訪問非const對象的非const數據成員、const數據成員,但不可以訪問const對象的任意數據成員

              一個沒有明確聲明為const的成員函數被看作是將要修改對象中數據成員的函數,而且編譯器不允許它為一個const對象所調用。因此const對象只能調用const成員函數

              const類型變量可以通過類型轉換符const_cast將const類型轉換為非const類型

              const類型變量必須定義的時候進行初始化,因此也導致如果類的成員變量有const類型的變量,那么該變量必須在類的初始化列表中進行初始化

              對于函數值傳遞的情況,因為參數傳遞是通過復制實參創建一個臨時變量傳遞進函數的,函數內只能改變臨時變量,但無法改變實參。則這個時候無論加不加const對實參不會產生任何影響。但是在引用或指針傳遞函數調用中,因為傳進去的是一個引用或指針,這樣函數內部可以改變引用或指針所指向的變量,這時const 才是實實在在地保護了實參所指向的變量。因為在編譯階段編譯器對調用函數的選擇是根據實參進行的,所以只有引用傳遞和指針傳遞可以用是否加const來重載。一個擁有頂層const的形參無法和另一個沒有頂層const的形參區分開來。

            【const的理解和用法】相關文章:

            C語言關鍵字const用法09-06

            C++ 中const和復合類型08-07

            c++ const引用與非const引用09-15

            C++中const-cast與reinterpret-cast運算符的用法10-22

            C語言中Static和Const關鍵字的作用09-23

            C語言的const使用方法07-02

            C語言關鍵字const的使用09-02

            c++中const關鍵字11-03

            英語單詞convenient的用法和例句04-15

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看