【寒江雪】Const指標小結
阿新 • • 發佈:2019-02-19
Const指標
在c/c++中,指標本身就是一個難點,再加與const的結合,常會產生許多讓人費解的地方,在這裡做個小結.
1.定義const物件
const int buffsize=512;
因為常量定義後就不能修改,所以定義時必須初始化.
const i,j=0; //error,i沒有初始化
2.const物件預設為檔案的區域性變數
//file1.cc
extern const int bufsize=512; //定義並初始化
//file2.cc
extern const int bufsize; //宣告
for(int index=0;index!=bufsize;++index)
{
//...
}
非const變數預設為extern,要使const變數能夠在其它的檔案中訪問,必有顯示指定為extern.
3.指向const物件的指標
const int *p;
這個p是一個指向int型別const物件的指標,const限定了指標p所指向的型別,而並非p本身。也就是說p
本身並不是const。在定義時不需要對它進行初始化,還可以給p重新賦值,使其指向另一個const物件。
但不能通過p修改所指向物件的值。
示例1:int a=0; p=&a; 可以。
示例2:*p=20; 不可以。
結論:這種指向const物件的指標只是限制不能修改p指向物件的數值,而不是限制p指向什麼物件。
把一個const物件的地址賦給一個不是指向const物件的指標也是不行的。
示例3:const int b=10;
int *p2=&b; //error
const int *p3=&b; //ok
結論:因為變數b有const修飾,不能被修改。但指標p2是一個普通的指標,可以修改指向物件的值,兩種宣告矛盾,所以不合法。而指向const物件的指標不允許修改指標指向物件的數值,所以這種方式合法。
不能使用void*指標儲存const物件的地址,而必須使用const void*型別儲存const物件的地址。
const int a=6;
void *p=&a;//error
const *cp=&a;//ok
int const *p;
c++規定,const關鍵字放在型別或變數名之前是等價的.
const int n=5; //same as below
int const m=10;
const int *p; //same as below const (int) * p
int const *q; // (int) const *p
4.const指標
int c=20;
int *const p4=&c;
指標p4稱為const指標。它和指向const物件的指標恰好相反,它不能夠修改所指向物件,但卻能夠修改指向物件的數值。另外,這種指標在宣告時必須初始化。
5.指向const物件的const指標
const int d=30;
const int *const dp=&d;
指標dp既不能修改指向的物件,也不能修改只想物件的值。