在單層運算的前提下:
將常量或非常量數據的地址賦給指向常量的指針是合法的:普通類型和const類型指針 -> const類型指針
const int array1[4] = {0,1,2,3};
int array2[4] = {0,1,2,3};
const int *pr = array1; //合法
pr = array2; //合法
可只有非常量數據的地址纔可以賦給普通的指針:普通類型指針只能 -> 普通類型指針
const int array1[4] = {0,1,2,3};
int array2[4] = {0,1,2,3};
int *pr = array1; //非法
pr = array2; //合法
但在進行兩層間接運算時,這樣的賦值將不再安全,如果允許這樣賦值,可能會產生如下的問題:
例程:
void main( void )
{
const int **pp2 = NULL;
int *p1 = NULL;
const int n = 13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;
}
將 pp2、p1 和 n 初始化:
當pp2 = &p1時,*pp2 = p1 = 0x00000000。
然後再將*pp2 = &n,也就是將p1指向n。
再借由普通變量指針 p1 將常量 n 的值改變。
所以當運算達到一層以上時,普通類型的指針將不能賦給 const 類型的指針。
否則將有可能借由普通指針之手把常量值改變。