也談const 修飾符

2021-05-17 12:06:20 字數 1372 閱讀 5412

指向常量物件的指標與常量指標,兩者在表達方式及作用意義上有什麼不同?

const int *count;

int const *pint;

兩者有什麼不同呢?

一. 指向常量的指標

const int *count; 實際表示count 所指向的物件是int 型的常量物件,它意味著不能通過該指標來間接地修改任何它所指向的物件,不論該物件本身是否為const 型;但它同時也意味著指標本身可以被修改。對於這種型別的指標,正確的作用方法有:

1. 對於乙個const 型別的物件,必須通過乙個指向const 物件的指標來指引。即:

const int i;

int *pint = &i;      // 編譯錯誤

const int *pint = &i;       // 對了

2. 對於乙個非const 型別的物件,也可以通過乙個指向const 物件的指標來指引,這樣就不能通過指標來間接地修改該物件。即:

int i;

const int *pint = &i;

*pint += 5;        // 將導致編譯錯誤。因為pint 所指向的物件已經被編譯器認為是const 的,所以不能再被修改。

這種用法,最常見在函式引數的傳遞上。為了確保作為引數所傳遞的某個指標所指向的物件在函式內部不被修改時,就可以將該指標引數宣告為這種型別。

3. 可以修改這個指標本身,即它可以繼續指向別的位址。

const int *pint = &a;

pint = &b;        // 這是允許的

二. 常量指標

int a;

int *const pint = &a;     // 這裡pint 就是乙個常量指標

常量指標,也其實也就是一種常量物件。它不能被修改,即不能再指向其它位址;但它所指向的物件的值,可以被修改。由於常量指標本身是種常量,因此在它被定義時就必須初始化。

*pint++;       // 是正確的

int b;

pint = &b;     // 錯了

不過說實在,常量指標的確不太常用,它的使用價值確實很小。

三. 指向const 物件的const 指標

int i;

const int *const pint = &i;

這裡pint 就是乙個指向const 物件的const 指標。在這種情況下,pint 所指向的物件的值,及它本身所指向的物件,都不能被改變。

對於const 的修飾作用,乙個總的原則就是:如果要強調某個物件是const 型,就應該讓const 盡量地靠近這個物件。

在const 物件與非const 物件之間,可以進行型別的轉換。這其實又涉及到資料型別轉換方面的話題,這可以作為乙個話題單獨說說。

const 型別修飾符

const是用來限定所指定的變數或者函式不可作修改。1 修飾變數 當const用來修飾變數的時候,const所指定部分不可修改。a.修飾常規變數 如 const int a 10 int const a 10 這兩種方式的效果一樣,都是將a描述為常量,a的值在被賦初值後不可以修改。但是這和由巨集定義...

const修飾符 小結

1.const 和extern 預設狀態下const物件僅在檔案內有效 當編譯器以初始化的方式定義乙個const物件時,編譯器將在編譯過程中吧用到該變數的地方都替換成對應的值,為了執行上述替換,編譯器必須知道變數的初始值,所以通常const的有效域就在本檔案 為了能在其他檔案中使用該const變數 ...

CONST修飾符的理解

目前在進行c語言補習時,發現很多的同學對於const這個關鍵字的理解存在很大的誤解。現在總結下對這個關鍵字理解上的誤區,希望在以後的程式設計中,能夠靈活使用const這個關鍵字。1 const修飾的變數是常量還是變數 對於這個問題,很多同學認為const修飾的變數是不能改變,結果就誤認為該變數變成了...