指針常量和常量指針,你到底明白了多少?

指針常量和指針常量,從字面上就很讓人混淆不分。指針常量,英文名是pointer costant,而常量指針,英文名是costant pointer,稍微留意一下,這個“而”不是轉折,是並行。所以,首先得分清楚兩者之間的區別。

<span style="font-family:Comic Sans MS;">	int a =4;
	int b = 5;
	int c = 6;
	int const *p1 = &b;//const 在前,定義爲常量指針</span>
<span style="font-family:Comic Sans MS;">	int *const p2 = &c;//*在前,定義爲指針常量 </span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>cout << "old values and pointer's address" << endl; 
<span style="white-space:pre">	</span>cout << p1 << " " << *p1 << endl;
<span style="white-space:pre">	</span>cout << p2 << " " << *p2 << endl;
</span>

結果輸出如下:


指針必須初始化,否則就內存泄露。所以,根據以上代碼可以清楚地知道,誰在前面,就是什麼類型,常量+指針,就是常量指針,反之就是指針常量。所以,親愛的小夥伴們,明白怎麼區分了嗎?

那麼,問題就來了,到底這兩者之間的區別是什麼呢?

下面我們就來看一段代碼:

<span style="font-family:Comic Sans MS;">	p1 = &a;
	//*p1 = 23; //error:assignment of read-only location 
 	cout << p1 << " " << *p1 << endl;
	c = 22; 
	*p2 = c;
	//p2 = &b; //error:assignment od read-only variable 'p2' 
	cout << p2 << " " << *p2 << endl; </span>

p1是常量指針,當我們企圖改變它的地址和它指向的內容的時候,發現指向的內容是不可變的。其實從字面上也可以解釋,一個指針都已經是常量了,(所謂的指針也就是變量,只不過這個變量保存的是地址值,也就是內存),那我們是不能動它的了。但是,我們可以改變p的地址,也就是指針的值,當然啦,地址變了,地址指向的內容也就隨之變化了。即輸出結果:


p1改變了地址,內容也隨之跟新了,我這裏用的詞是更新,因爲地址指向的是變量a,而a的值是4。所以,本質上,從操作上是不能刻意去改變指針指向的內容的值,只要把其指向的地址更新就可以了。

p2改變了其指向的內容的值後,p2的地址倒是沒變。就相當於這個內存保存的內容換了。注意這裏是“換”。

附上整個源代碼,供參考:

<span style="font-family:Comic Sans MS;">#include<iostream>
using namespace std;

int main() 
{ 
	int a =4;
	int b = 5;
	int c = 6;
	int const *p1 = &b;//const 在前,定義爲常量指針
	int *const p2 = &c;//*在前,定義爲指針常量 
	cout << "old values and pointer's address" << endl; 
	cout << p1 << " " << *p1 << endl;
	cout << p2 << " " << *p2 << endl;
	cout << "new values and pointer's address" << endl; 
	p1 = &a;
	//*p1 = 23; //error:assignment of read-only location 
 	cout << p1 << " " << *p1 << endl;
	c = 22; 
	*p2 = c;
	//p2 = &b; //error:assignment od read-only variable 'p2' 
	cout << p2 << " " << *p2 << endl; 
} </span>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章