頂層const(top-level const)表示指標(或引用等)本身是個常量。底層const(low-level const)表示指標指的物件是乙個常量。
一般當說到頂層或底層const的時候都是指標或者引用型別的,因為普通型別的const只能是底層的。
例如:
const int i = 0;//i 表示是乙個常量整型,i是不能夠改變的,因此它是乙個頂層const
int j =1;
int *const p1 = &j;//表示指標p1本身是不可以改變的,這是乙個頂層const,表示p1將就永遠指向j
const int *p2 = &i;//表示p2指向的是乙個常量整型,而p2本身是可以改變的,這是乙個底層const
const int *p2 = &j;//也是正確的,p2只是自覺地不會改變它指向的值,這只是它的一相情願罷了
int *p3 = &i;//錯誤,因為通過指標p3可能會改變i的值,而i是不可以被改變的
其實頂層還是底層只是個名詞,你完全不需要記住,但是你要知道它們的區別並會用,例如在函式的形參和實參的使用:
void f(const int i);//宣告乙個函式
int j =0;
f(j);//呼叫函式f,傳入實參j,這是合法的,因為void f(const int i)表示在f函式中不能改變i的值,因此對實參沒什麼特殊要求,只傳進去值就可以了,這樣i得到這個 //值後就可以在函式中進行一系列的操作了
void f(const int *i)//宣告乙個形參是指向常量整型的指標的函式,表示(*i)的值在函式內不會改變
const int j = 0;
f(&i)//合法的
f(&j)//合法的
void f(int *i)//宣告函式,形參是乙個指向整型的指標
f(&j)//不合法,因為在函式內可能會改變指標i所指向的變數的值,而j是不允許被改變的。
因此我們知道,
當我們在函式內不需要改變傳入的變數的值的時候,盡量使用const
,這樣對實參的限制更少一點。
頂層const 底層const
頂層const 底層const 個人理解 頂層cosnt 就是不影響變數型別,作為修飾符的存在。底層則會影響到變數型別 例如 int pi 這是乙個int 型別的變數,乙個指向int型的指標。int const p1 這還是乙個int 型別的變數 首先p1是乙個指標型別,指向的是int型別的值。才不...
頂層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
是否可修改所指向的物件 是否可通過指標修改物件的值 頂層const 指標本身是常量。否 是 底層const 指標所指的物件是常量。是 否 int a 0 const int b 1 const int p1 a 底層const p1指向a int const p1與const int p1等效 p1...