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就是一個底層const
class若是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