網上很多人已經寫過關於指針用法文章,對於指針,我結合一些具體的實例,寫一點自己的看法。
第一篇:const int * p和int * const p
這個問題是老生常談的問題,但我還是有很多人到真正使用的時候就犯迷糊,希望看過如下的解釋,能夠徹底明白。
首先,我們要牢記一點:const在*前是修飾指針所指向的變量,const在*之後是修飾定義的指針本身。
const本身起到的修飾作用是“常量”。例如const int *p,const修飾的是*p,也就是指針p所指向的值必須是個常量;而int * const p,const修飾的是指針p本身,也就是指針p必須是個常量。請看例子example01和example02:
- /*VC++6.0 IDE*/
- //example01
- int main(int argc, char* argv[])
- {
- int a = 12;
- const int * p = &a;
- *p = 0; //將指針p指向的值修改爲0,編譯會報錯:error C2166: l-value specifies const object
- return 0;
- }
//example02
int main(int argc, char* argv[])
{
int a = 12;
int b = 10;
int * const p = &a;
*p = 0; //正確
p = &b; //將指針p本身的值修改爲&b,編譯會報錯: error C2166: l-value specifies const object
return 0;
}
通過上面的例子,可以看到const修飾的作用。但是是不是const int *p定義的指針p指向的值永遠不能改變?否!請看下面例子:
- /*VC++6.0 IDE*/
- //example03
- int main(int argc, char* argv[])
- {
- int a = 12;
- const int * p = &a;
- //*p = 0; //將指針p指向的值修改爲0,編譯會報錯:error C2166: l-value specifies const object
- a = 0; //不能通過*p = 0來修改p指向的值,但是可以通過這樣的方法進行修改
- cout << *p << endl; //打印出0
- return 0;
- }
- 而int * const p定義的指針p本身的值也不可以改變呢?是的。一旦初始化賦予a的址值,此時int * const p中的指針p本身值就再也不能改變了。
- 經過上面一番周折,現在可以很容易理解const int * const p的意思了吧。它定義的是一個指向常量值的常量指針。我想我也不必多費口舌了。