1. 程式人生 > >指標常量、常量指標與指向常量的指標常量小結(C/C++)

指標常量、常量指標與指向常量的指標常量小結(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)指向常量的指標常量。按照道理來說,他應該指向一個常量,此時不能更改指向地址、也不能更改指向地址的值。然而,如果指向的不是常量,那麼可以通過修改被指物件的值而改變