例看const與指針兼容性

在單層運算的前提下:

將常量或非常量數據的地址賦給指向常量的指針是合法的:普通類型和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 類型的指針。

否則將有可能借由普通指針之手把常量值改變。

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