指標常量、常量指標與指向常量的指標常量小結(C/C++)
一 指標常量:
int a;
int *const pcb = &a; //const放在指標宣告操作符的右側
只要const位於指標宣告操作符右側,就表明宣告的物件是一個常量,且它的內容是一個指標,也就是一個地址。上面的宣告可以這麼讀,聲明瞭一個常量pcb,它的值是變數a的地址(變數a的地址,也就是指向變數a的指標)。
因為指標常量是一個常量,在宣告的時候一定要給它賦初始值。一旦賦值,以後這個常量再也不能指向別的地址。也就是說指標常量的指向地址一旦賦值就不能改變。
雖然指標常量的值不能變,可是它指向的物件是可變的,因為我們並沒有限制它指向的物件是常量。
例如:
(1)如上所述:
int a;
int *const pcb = &a; //const放在指標宣告操作符的右側
a=1;
#include<iostream> using namespace std; int main() { int a; int *const pcb = &a; //const放在指標宣告操作符的右側 a = 1; cout << *pcb << endl; *pcb = 3; cout << *pcb << " \t" << a << endl; system("pause"); return 0; } 輸出: 1 3 3
(2)又如
#include<iostream>
using namespace std;
int main()
{
char a[] = "abcde1234";
char *const c = a;
cout << c << endl;
c[0] = 'x';
cout << c << "\t" << a << endl;
system("pause");
return 0;
}
輸出:
abcde1234
xbcde1234 xbcde1234
二:常量指標:
常量指標的使用要注意,指標指向的物件不能通過這個指標來修改
形如:const int *p;
例如:
int a = 5; const int b = 8; const int *c = &a; // 這是合法的,非法的是對c的使用 *c = 6; // 非法,但可以這樣修改c指向的物件的值:a = 6; const int *d = &b; // b是常量,d可以指向b,d被賦值為b的地址是合法的
#include<iostream>
using namespace std;
int main()
{
int a = 5;
const int b = 8;
const int *c = &a; // 這是合法的,非法的是對c的使用
cout << a << "\t" << *c << endl;
a = 6;
cout << a << "\t" << *c << endl;
c = &b;
cout << a << "\t" << *c << endl;
// *c = 6; // 非法,但可以這樣修改c指向的物件的值:a = 6;
const int *d = &b; // b是常量,d可以指向b,d被賦值為b的地址是合法的
system("pause");
return 0;
}
輸出:
5 5
6 6
6 8
三:指向常量的指標常量
在C/C++中,這麼宣告:
const int a = 25;
const int * const b = &a;
看,指標宣告操作符左邊有一個const,說明宣告的是一個指向常量的指標。再看,指標宣告操作符右邊有一個const,說明宣告的是一個指標常量。前後都鎖死了,那麼指向的物件不能變,指標常量本身也不能變。
#include<iostream>
using namespace std;
int main()
{
char a[] = "abcde1234";
const char b[] = "bcde"; // b是指向常量字串的指標變數
char *const c = a; // c是指向字元指標變數的常量
const char * pc = a; // pc是指向字元常量指標
const char *const cpc = a; // cpc是指向字元常量的指標常量
const char *const d = b; // d是指向字元常量的指標常量
c[0] = 'x';
cout << a << "\t" << c << "\t" << pc << "\t" << cpc << endl;
a[1] = 'x';
cout << a << "\t" << c << "\t" << pc << "\t" << cpc << endl;
// pc[2] = 'x';//非法操作
// cpc[2] = 'x';//非法操作
system("pause");
return 0;
}
輸出:
xbcde1234 xbcde1234 xbcde1234 xbcde1234
xxcde1234 xxcde1234 xxcde1234 xxcde1234
#include<iostream>
using namespace std;
int main()
{
const int a = 25;
const int * const b = &a;
cout << a << "\t" << *b << endl;
// a = 1;//非法
// *b = 1;//非法
system("pause");
return 0;
}
輸出:
25 25
四:總結
(1)指標常量,一旦初始化就不能更改指向物件。也就是說指標指向的地方是常量,而被指向地址所放的值可以改變。
(2)常量指標,指標指向值為常量,不可以通過常量指標去改變。只能通過被指向物件本身去改變。
(3)指向常量的指標常量。按照道理來說,他應該指向一個常量,此時不能更改指向地址、也不能更改指向地址的值。然而,如果指向的不是常量,那麼可以通過修改被指物件的值而改變。