常量指針 和 指針常量
2006年3月12日 植樹(shù)節(jié)
在C++的學(xué)習(xí)中,有人經(jīng)常搞不清楚“常量指針”和“指針常量”這兩個(gè)概念。其實(shí)簡(jiǎn)單一點(diǎn)講,“常量指針”所指向的地址上的數(shù)據(jù)是常量,而“指針常量”所指向的地址是常量,地址上面的數(shù)據(jù)是可以變化的。
下面看及格簡(jiǎn)單的例子,可以說(shuō)明他們的區(qū)別:
第一個(gè)
1 void main(){
2 char *str1={"Hello"};
3 char *str2={"Hello World"};
4 char * const ptr1 =str1 ;
5 //指針常量--指針本身是常量,指向的地址不可以變化,但是指向的地址所對(duì)應(yīng)的內(nèi)容可以變化
6
7 ptr1 =str2; //錯(cuò)誤 因?yàn)檫@是一個(gè)常量指針,改變指向的地址了
8
9 printf("%s \n",*ptr1);
10 }
11
12
13 // 編譯錯(cuò)誤 error C3892: 'ptr1' : you cannot assign to a variable that is const
14
>第二個(gè)
1 void main(){
2 char *str1={"Hello"};
3 char *str2={"Hello World"};
4 char * const ptr1 =str1 ;
5 //指針常量--指針本身是常量,指向的地址不可以變化,但是指向的地址所對(duì)應(yīng)的內(nèi)容可以變化
6
7 *ptr1 ='A';// 正確 因?yàn)橹赶虻牡刂返膬?nèi)容是可以變化的
8
9 printf("%c \n",*ptr1);
10 }
11
12 //輸出 A
13
第三個(gè)
1 void main(){
2 char *str1={"Hello"};
3 char *str2={"Hello World"};
4 const char *ptr1 = str1;
5 //常量指針--指向字符串常量,所指向的字符串內(nèi)容不能變,但是指向的地址可以變化
6
7 ptr1=str2;// 正確 因?yàn)橹赶虻牡刂肥强梢宰兓?/SPAN>
8
9 printf("%s \n",ptr1);
10 }
11
12 //輸出 Hello World
第四個(gè)
1 void main(){
2 char *str1={"Hello"};
3 char *str2={"Hello World"};
4 const char *ptr1 = str2;
5 //常量指針--指向字符串常量,所指向的字符串內(nèi)容不能變,但是指向的地址可以變化
6
7 ptr1='A';// 錯(cuò)誤 因?yàn)橹赶虻牡刂肥莾?nèi)容是不可以變化的
8
9 printf("%c \n",ptr1);
10 }
11
12
13 //編譯錯(cuò)誤 error C2440: '=' : cannot convert from 'char' to 'const char *'
14
相信從上面四個(gè)簡(jiǎn)單的例子可以看出他們不一樣的地方把,在這里要請(qǐng)大家注意一下的地方是:
指針常量的申明:const 放在* 和指針名之間 Type * const pointer ;
常量指針的申明:const放在類(lèi)型說(shuō)明符之前 const Type *pointer ;