搞懂頂層const和底層const

2021-09-19 06:48:30 字數 1710 閱讀 7089

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 更新: 書寫錯誤

int const * const p;

^ ^

1 2

頂層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

頂層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是...