const用法詳解

2021-06-01 10:34:18 字數 2461 閱讀 2786

到const

關鍵字,很多人想到的可能是

const

常量,其實關鍵字

const

並不能把變數變成常量!在乙個符號前加上

const

限定符只是表示這個符號

不能被賦值。也就是它的值對於這個符號來說是唯讀的,但它並不能防止通過程式的內部

(甚至是外部

)的方法來修改這個值

(c專家程式設計

.p21)

。也就是說

const

變數是唯讀變數,既然是變數那麼就可以取得其位址,然後修改其值。看來

const

也是防君子不防小人啊!

:)const 

使用情況分類詳析1、

const

的普通用法

const int n = 10

;意思很明顯,

n是乙個唯讀變數,程式不可以直接修改其值。這裡還有乙個問題需要注意,即如下使用:

int a[n]

;在ansi c

中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而

n只是乙個變數。2、

const

用於指標

const int *p

;;//p可變,*p不可變

int const *p

;;//p可變,*p不可變

int * const p

;;//p不可變,*p可變

在最後的一種情況下,指標是唯讀的(即

p唯讀),而在另外兩種情況下一樣,指標所指向的物件是唯讀的(即

*p唯讀)。

const 

是乙個左結合的型別修飾符,它與其左側的型別修飾符一起為乙個型別修飾符,所以,

int const 

限定*p,

不限定p

。int *const 

限定p,

不限定*p

。這裡有乙個簡便的區分方法:沿著*

號劃一條線,如果

const位於*

的左側,則

const

就是用來修飾指標所指向的變數,即指標指向為常量;如果

const位於*

的右側,

const

就是修飾指標本身,即指標本身是常量。3、

const

用於函式的位址傳遞引數

void foo(const int *p)

這種形式通常用於在陣列形式的引數中模擬傳值呼叫。也就是相當於函式呼叫者聲稱:

"我給你乙個指向它的指標,但你不能去修改它。

"如果函式編寫者遵循了這個約定,那麼就相當於模擬了值傳遞。這也是

const

最有用之處了:用來限定函式的形參,這樣該函式將不會修改實參指標所指的資料。這裡注意了,是函式不應該去修改而不是不能修改,也就是說

const

不能阻止引數的修改

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

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

#include

#include

void

changestr(const

char

*string)}

intmain(void

)//end

上面的程式把字串中的每個字元都轉換成大寫字母了。因為*string把位址給了*source,而*source的值的改變編譯器並不干涉,可能有的編譯器會發出警告之類。上面的程式只是為了說明const並不會阻止

引數的修改,如果象上面程式那樣,個人感覺沒什麼意義,只會讓人容易混亂而已。

const用法:定義常量,修飾指標、函式的輸入引數和返回值,簡單說const表示唯讀的意思,本質上來說它只是在全域性資料段或者棧中定義的是乙個唯讀的常量,不是真正位於字串常量區。const的目的是為了產生高質量的**,提高**的可讀性,同時保護好不能被任意改變的記憶體,從而降低bug產 生的概率。

const int a = 10;

const int b;//

錯誤,常量必須初始化

int a = 10,b = 9;

const int *p1 = &a;//

指標指向的內容唯讀,不能通過該指標去寫

*p1 = 11;//

錯誤int * const p2 = &a;//

指標本身唯讀,指標初始化到乙個物件後,將不能被修改

p2 = &b;//

錯誤const int*p3const= &a;//

指標本身和指向的內容都是唯讀

const char *fp1(void) //

修飾返回值,表示返回的指標指向內容唯讀

void fp1(const char *str)

int _tmain(int argc, _tchar* argv)

const用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

const 用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

const用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...