使用指針時要涉及兩個目標,即指針自己和指針所指的對象。關於const指針變量,可歸結爲如下三種:
1.指向常量的指針變量;
2.常指針變量;
3.指向常量的常指針變量。函數
1、指向常量的指針變量:
聲明格式: const type * var_name;
或 type const * var_name;
特色:可改值。
將指針聲明冠以const,使指向的對象爲常量,而不是指針爲常量。注意:指向常量的指針不必定指向真正的常量,它也能夠指向變量,只是從該指針的角度來看,它所指向的對象是常量,經過該指針不能修改它指向的對象。它還能夠指向其它的對象,能夠不初始化。this
例1:spa
int a = 0,b = 1; const int c = 3; const int* pi; //等同於 (const int*) pi; pi = &a; //*pi = 10; //錯誤:不能修改它指向的對象。 a = 10; pi = &b; //*pi = 20; //錯誤:不能修改它指向的對象。 b = 20; pi = &c; //*pi = 30; //錯誤:不能修改它指向的對象。
char const* pc = "asdf"; //pc[3] = 'a'; //錯誤:不能修改它指向的對象。 pc = "ghik"; char const* step[3] ={"left","right","hop"}; step[2] = "skip"; //step[2][1] = 'i'; //錯誤:不能修改它指向的對象。
2、常指針常量:
聲明格式: type* const var_name;
const (char*) pContent;
特色:可改對象。
要把指針自己 而不是它指向的對象聲明爲常量,採用運算符 *const,必須初始化,經過該指針能夠修改它指向的對象,但它不能夠指向其餘的對象。指針
例:code
int a = 0,b = 1; int* const pi = &a; //等於 int* (const pi) = &a; *pi = 10; //pi = &b; //錯誤:pi自己爲常量,不能指向其餘對象。
3、指向常量的常指針變量:
聲明格式: const type * const var_name;
特色: 值與對象均不能改。
要使兩個目標都是常量,二者都要聲明爲 const 。對象
例1:blog
int a = 0,b = 1; const int c = 3; const int* const pi = &a; //至關於: (const int*)(const pi) = &a; //*pi = 10; //錯誤:不能修改它的對象。 a = 10; //pi = &b; //錯誤:不能指向其它對象。
通常的,當聲明中出現 const 描述符時,它修飾的是緊跟其後的聲明元素或者在 const 成員函數聲明中函數的 this 指針。
注意:能夠將變量的地址賦給指向常量的指針變量,不會所以有什麼害處,可是,常量的地址不能賦給無約束的指針。
例:ip
int a = 1; const int c = 2; const int* p1 = &c; const int* p2 = &a; int* p3 = &c; //非法! *p3=3; printf("%d\n",c);//c被改變了 int* const p4 = &c; //非法! 指針常量 p4 可以改值。 *p4=4; printf("%d\n",c);//c被改變了 const int* const p5 = &c;