對於指標和常量,有以下三種形式都是正確的:
複製代碼 代碼如下:const char * myPtr = &char_A;//指向常量的指標
char * const myPtr = &char_A;//常量的指標
const char * const myPtr = &char_A;//指向常量的常量指標
下面依次對這三種類型進行介紹。
因為*操作符是左操作符,左操作符的優先順序是從右至左,對於
1.常量指標(Constant Pointers)
複製代碼 代碼如下:int * const p
先看const再看* ,是p是一個常量類型的指標,不能修改這個指標的指向,但是這個指標所指向的地址上儲存的值可以修改。
執行個體1:複製代碼 代碼如下:#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
int i1=30;
int i2=40;
int * const pi=&i1;//這裡的pi指標式常量。
//pi=&i2; //注意這裡,pi不能再這樣重新賦值了,即不能再指向另一個新地址。所以我已經注釋了它。
printf("%d\n", *pi ) ; //輸出是30
i1=80; //5.想想看:這裡能用*pi=80;來代替嗎?可以,這裡可以通過*pi修改i1的值。
printf("%d\n", *pi ) ; //輸出是80
system("pause");
}
執行個體2:複製代碼 代碼如下:char char_A = 'A';
char char_B = 'B';
char * const myPtr = &char_A;
myPtr = &char_B; // error - can't change address of myPtr
2.指向常量的指標(Pointers to Constants)
複製代碼 代碼如下:const int *p
先看*再看const,定義一個指標指向一個常量,不能通過指標來修改這個指標指向的值。
執行個體3:複製代碼 代碼如下:#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
int i1=30;
int i2=40;
const int * pi=&i1;
printf("%d\n", *pi ) ; //輸出是30
pi=&i2; //注意這裡,pi可以在任意時候重新賦值一個新記憶體位址
i2=80; //想想看:這裡能用*pi=80;來代替嗎?當然不能
printf("%d\n", *pi ) ; //輸出是80
system("pause");
}
執行個體4複製代碼 代碼如下:char char_A = 'A';
const char * myPtr = &char_A;
*myPtr = 'J'; // error - can't change value of *myPtr
所以指標p所指向的整型數是一個常量,其值不能被修改。
3.指向常量的常量指標
對於“指向常量的常量指標”,就必須同時滿足上述1和2中的內容,既不可以修改指標的值,也不可以修改指標指向的值。
4.引入字元數組和字元指標
字元數組和字元指標的定義如下:複製代碼 代碼如下:char a[] = "I Love You!"; //定義了一個字元數組
char *p = "I Love You!"; //定義了一個字元指標
可以將a理解為常量指標,而p為指向常量的指標,代碼執行個體如下:複製代碼 代碼如下:#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
char a[] = "I Love You!"; //定義了一個字元數組,數組名a是一個常量指標,指向的位置不變,都是數組第一個元素的位置
char *p = "I Love You!"; //定義了一個字元指標,指標p指向一個字串常量,這個字串常量不能修改
//*(p+1)='a';//錯誤,不可以修改指標指向的值,所以這裡注釋掉。
a[1]='a';//常量指標,不能修改指標的值,但是可以修改指標所指向的值。
//a=p;//錯誤,a是常量指標,不可修改其值。
cout<<a<<endl;
cout<<p<<endl;
cout<<a[1]<<endl;
cout<<*(p+2)<<endl;
system("pause");
}
輸出值為:
IaLove You!
I Love You!
a
L