2015-1-6 const和指針

首先來定義兩個數組作爲說明的例子。

	int a[10]={0};
	const int b[10]={0};

一、對於Int a[10]={0}看下面幾個指針初始化的代碼:

	int *error_p;//1
	*error_p=4;

	int *p=a;//2
	const int* p1=a;//3
	int const* p2=a;//4
<span style="white-space: pre;">	</span>int* const p3=a;//5
	const int* const p_cannotchange=a;//6
對於上面6個指針,一一說明:

1.錯誤!因爲error_p沒有經過初始化被分配空間,就指向了一個常量。雖然編譯會通過,但是運行就會警告error_p未初始化!這樣的行爲不可控,是很危險的

2.常規的指針初始化,p指向a數組,沒什麼好說的

3.p1是const int*類型,指針指向的數據類型(*p1)爲const int。

p1指向a數組很好理解,前綴const代表不允許通過指針p1來該表a[ ]中的值!就好比對於指針指向的元素加了一個讀寫保護。但是我們依然可以通過p1++、p1+2等操作來訪問a[ ]中的元素。

4.暫時沒發現和3有什麼區別。

5.p2是int* 型,指針指向的數據類型(*p2)爲int。

其值被限定爲const,雖然p2指向a[ ],但是其值本身被限定爲不可改變。也就是說無法通過p2++等操作改變所指對象!形象的說就是指針自己被保護起來

6.有了上面的基礎,很好理解,指針本身被保護無法改變,同時指針指向的元素也被保護無法通過指針來操作。我們能做的僅有訪問。


==============================================================

二、對於const int b[10]={0}看下面代碼

	const int *q2=const_a;//1.合法
	const int const *q2=const_a;//2.合法
	int *q1=const_a;//3.非法!
	int* const q2=const_a;//4.非法!
以上4條語句比較好理解,只要遵循指針和所指對象的數據類型一致!即可理解錯誤在哪裏。

const int 型的數組b[ ]必須由const int 類型的指針來指,就如同定義一個結構體struct,必須用struct*來指一樣。



以上就是const和指針的一點總結。

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