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:
表示指標所指向的物件是個常量
將const考慮成向右結合
2017-02-11 更新: 書寫錯誤頂層const(上述**中int const * const p;
^ ^
1 2
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
頂層const和底層const
頂層const 本身是乙個常量 底層const 所指的物件是乙個常量 int const p1 i const修飾p1,p1本身是乙個const,所以這個const是頂層const const int ci 42 const修飾ci,ci本身是乙個const,頂層 const int p2 ci c...
頂層const和底層const
1.頂層 const 與底層 const概念 指標本身是乙個物件,因為,指標實際對應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個完全不同的概念,頂層 const表示的是指標本身是乙個常量,底層const 表示的是指標所指的物件是乙...
頂層const和底層const
今天讀到函式這章,發現又說到了頂層 高層 const和底層 低層 const,然而自己對他們還是一知半解,就重讀了有關這一部分的知識。感覺自己已經理解了,總結一下。首先這裡是書中的原話 用名詞頂層const表示指標本身是乙個常量 用名詞底層const表示指標所指的物件是乙個常量。我們知道const是...