1. 程式人生 > 其它 >C語言關鍵字const詳解

C語言關鍵字const詳解

技術標籤:C

C語言關鍵字const詳解

一、const修飾普通變數
1、const int a = 10;

const修飾了int,表示這段程式碼定義的變數,最後取的是int型且值為10,不可被後面的程式碼修改。
2、int const a = 10;

const修飾了變數a,表示這段程式碼定義的變數,最後取的值是int型且為10,不可被後面的程式碼修改。


二、const修飾指標變數
1、const int* p1;

const修飾int,表示指標指向的物件為常量,*p1所指向的物件值不能通過*p1來修改,但是可以給p1重新賦值,使其指向不同的物件。

int a = 10;
int b = 9;
const int* p1 = &a;
p1 = &b;//正確,給p1重新賦值,使其指向不同的物件

int a = 10;
int b = 9;
const int* p1 = &a;
*p1 = b;//錯誤,*p1所指向的a的值不能通過*p修改

2、int const* p1;

const修飾int,表示指標所指向的內容為常量。(同const int* p1)

int a = 10;
int b = 9;
int const* p1 = &a;
*p1 = 10;//錯誤
*p1 = 19;//錯誤

int a = 10;
int b = 9;
int const* p1 = &a;
p1 = &b;//正確

3、int* const a;

const修飾a,a是一個指標(地址)變數,a中儲存的是地址值將是一個常量,這行程式碼中未被const修飾的是*a,即是對a所指向物件的取值,所以*a可以被修改。(不能賦值給其他的地址值,但可以修改a指向的值)

int a = 10;
int b = 9;
int* const p1 =  &a;
*p1 = 9;//正確


int a =10;
int b = 9;
int *const p1 = &a;
p1 = &b;//錯誤

4、const int **a;

const修飾int,表示這行程式碼定義的變數最後取的是int型的值,是常量,不可被修改。

但這段程式碼定義的a是一個地址值,因為沒有被const修飾,還是可以被修改。同理,這段程式碼中,*a也是一個地址變數,也沒有被const修飾,也可以被修改。

5、int const** a;

const修飾的是**a,**a表示這行程式碼定義的變數a的最終值,**a為int型值,即這段程式碼定義的a最後取的是int型的值是常量,不可被後面的程式碼修改。

但這段程式碼定義的變數a是一個地址變數,因為沒有被const修飾,還是可以被修改。同理,這段程式碼中,*a也是一個地址變數,也沒有被const修飾,也是可以被修改。

6、int** const a;

const修飾了a,a表示這行程式碼定義的地址變數,a中儲存的是一個地址值,a因此是一個地址常量,不可被後面的程式碼修改。

但是*a是一個地址變數,因為沒有被const修飾,還是可以被修改。同理,這行程式碼中**a也是一個int變數,也沒有被const修飾,也可以被修改。

7、const int* const a;

a所指向的物件的值以及a本身儲存的地址值都是常量,都不能被修改。

8、int const* const a;

a所指向的物件的值以及a中儲存的地址值都是常量,都不能被修改。

(const距離變數名近就是修飾指標變數。距離變數名遠就是修飾指標指向的物件,如果近和遠都有,就同時修飾指標變數和指標變數所指向的物件)

三、const修飾函式

1、const修飾函式引數

如果函式引數是輸出引數,則不能用const修飾

如果函式引數是輸入引數,則可以用const修飾

a)const用於修飾“指標傳遞”的引數,以防止意外改動指標所指向的資料,例如void stringCopy(char* strDest,const char* strSource)

b)用於修飾“指標傳遞”的引數,以防止意外改動指標本身,例如void swap(int* const p1,int* const p2)

2、const修飾函式返回值

a)const修飾函式返回值,返回指標。如果以“指標傳遞”的方式的函式返回值加const修飾,那麼函式返回值的內容不能被修改。該返回值只能被賦值給const修飾的同類型指標。

例如:

const char* getstring();
char* str = getstring();//錯誤
const char* str = getstring();//正確

b)const修飾“返回引用”的函式返回值

int& min(int& i,int& j);
min(a,b)=4;//正確

const int& min(int& i,int& j);
min(a,b) = 4;//錯誤

3、const修飾函式

在類中將成員函式修飾為const表明在該函式體內,不能修改物件的資料成員而且不能呼叫非const函式。為什麼不能呼叫非const函式?因為非const函式可能修改資料成員,const不能修改資料成員,所以const成員函式內只能呼叫const函式。