搞懂頂層const和底層const

C語言雖然簡單,可是重難點仍是不少的,就好比讓須要新手比較蛋疼的指針問題,可是深刻學習以後指針纔是碰到的第一個攔路虎,也是最簡單的一個。好比聲明問題,頂層const和底層const。今天說說後者。函數

聲明問題能夠理解爲複雜指針,函數指針的聲明和解讀問題學習

int (*f(int, int))(int);
// f 是一個有兩個int類型參數的函數,函數返回指向具備一個參數爲int類型,返回類型爲int的函數指針

如下有幾個栗子指針

int iVal = 520;
// 第一個栗子
const int *pVal1 = &iVal;
// 第二個栗子
int const *pVal2 = &iVal;
// 第三個栗子
int * const pVal3 = &iVal;
// 第四個栗子
int const * const pVal4 = &iVal;

分析

首先咱們說說頂層const和底層const的通俗定義
頂層const: 表示指針自己是個常量,更簡單的說頂層const做用對對象自己,表示對象自身是一個常量
底層const: 表示指針所指向的對象是個常量code

因此有如下結論(我的總結)

將const考慮成向右結合對象

  • 若是const右結合修飾的爲類型或者*,那這個const就是一個底層constclass

  • 若是const右結合修飾的爲標識符,那這個const就是一個頂層const引用

const的影響

2017-02-11 更新: 書寫錯誤新手

int const * const p;
      ^       ^
      1       2
  • 底層const(上述代碼中1的位置)主要影響的是指向的對象總結

    • 頂層const表示爲不能修改所指向的對象的值,即,所指向的對象是一個常量。語言

  • 頂層const(上述代碼中2的位置)主要影響的是對象自己

    • 表示對象自己不能被修改,即,對象(指針)自己是個常量,可是能夠修改指針所指向的對象的值。

理解以上前提爲要理解指針其實也是一個對象(int),這個對象的值是所要指向的對象的地址。
好比
對象 A 的地址 = 0x123456,對象 A 的值 = "ABCDEF"
指針 B 指向 對象 A
因此指針 B 的地址 = 0x234567, 指針 B 的值 = 0x123456
系統在棧或者堆中分配,由於指針自己是一個對象,也有屬於本身的地址,因此能夠有指向指針的指針
注意區別指針和引用

栗子分析

第一個和第二個栗子

const int *pVal1 = &iVal;
// const 右結合修飾 int ,因此這個const爲底層const
int const *pVal2 = &iVal;
// const 右結合修飾 * ,因此這個const爲底層const

第三個栗子

int * const pVal3 = &iVal;
// 這個const右結合修飾 pval3 ,修飾的是一個標識符,因此這個const爲頂層const

第四個栗子

int const * const pVal4 = &iVal;
// 第一個const修飾的是 * 因此第一個const是底層const
// 第二個const修飾的是 pVal4 因此這個const是頂層const
相關文章
相關標籤/搜索