指標與const限定符

2021-07-04 22:16:03 字數 1945 閱讀 5548

4. 

指標與const

限定符

const

限定符和指標結合起來常見的情況有以下幾種。

const int *a;

int const *a;

這兩種寫法是一樣的,

a是乙個指向

const int

型的指標,

a所指向的記憶體單元不可改寫,所以

(*a)++

是不允許的,但

a可以改寫,所以

a++是允許的。

int * const a; a

是乙個指向

int型的

const

指標,*a

是可以改寫的,但

a不允許改寫。

int const * const a; a

是乙個指向

const int

型的const

指標,因此*a和

a都不允許改寫。

指向非const

變數的指標或者非

const

變數的位址可以傳給指向

const

變數的指標,編譯器可以做隱式型別轉換,例如:

char c = 'a';

const char *pc = &c;

但是,指向

const

變數的指標或者

const

變數的位址不可以傳給指向非

const

變數的指標,以免透過後者意外改寫了前者所指向的記憶體單元,例如對下面的**編譯器會報警告:

const char c = 'a';

char *pc = &c;

即使不用

const

限定符也能寫出功能正確的程式,但良好的程式設計習慣應該盡可能多地使用

const

,因為: 1.

const

給讀**的人傳達非常有用的資訊。比如乙個函式的引數是

const char *

,你在呼叫這個函式時就可以放心地傳給它

char *

或const char *

指標,而不必擔心指標所指的記憶體單元被改寫。 2.

盡可能多地使用

const

限定符,把不該變的都宣告成唯讀,這樣可以依靠編譯器檢查程式中的

bug,防止意外改寫資料。 3.

const

對編譯器優化是乙個有用的提示,編譯器也許會把

const

變數優化成常量。 在

第3 節 「變數的儲存布局」

我們看到,字串字面值通常分配在

.rodata

段,而在第4 

節「字串」

提到,字串字面值類似於陣列名,做右值使用時自動轉換成指向首元素的指標,這種指標應該是

const char *

型。我們知道

printf

函式原型的第乙個引數是

const char *

型,可以把

char *

或const char *

指標傳給它,所以下面這些呼叫都是合法的:

const char *p = "abcd";

const char str1[5] = "abcd";

char str2[5] = "abcd";

printf(p);

printf(str1);

printf(str2);

printf("abcd");

注意上面第一行,如果要定義乙個指標指向字串字面值,這個指標應該是

const char *

型,如果寫成

char *p = "abcd";

就不好了,有隱患,例如:

int main(void)

p指向.rodata

段,不允許改寫,但編譯器不會報錯,在執行時會出現段錯誤。

指標和const限定符

const int p 1,表示p指向乙個整型變數,並且該變數為const的。2,可以更改p的值,不可以更改它所指向物件的值。3,它可以指向非const型別的int變數 int const p 1,表示p指向乙個整型變數,該變數為非const的 2,不可以更改p的值,一旦初始化不可更改,單可以更改它...

指標和const限定符

1 指向const物件的指標 const double pi 3.14 double ptr error ptr is a plain pointer const double cptr ok cptr is a pointer to const 不能用void 指標儲存const物件的位址,而必須...

指標和const限定符

一 指向const物件的指標 1 定義格式 const 型別 指標名 const放在型別名的前面,它是用來限定物件的型別的,即物件的型別是 const 型別 2 由於物件是const型別,在定義的時候進行了初始化之後就不能被修改,所以通過指向const物件的指標修改物件的值是錯誤的。3 把乙個con...