const修飾的指針

C++用const修飾指針共有四種寫法(前兩種同樣):express

int a = 100,b = 10;

1  const int *p = &a;
2  int const *p = &a;
3  int *const p = &a;
4  const int *const p = &a;


一、首先說第一種,第一種定義了一個指向常量的指針,固然也能夠指向變量,可是指針自己並非常量,因此能夠改變指針的指向,像這樣:spa

p = &b;

*p = b; //錯誤,由於p是指向const的指針,不能經過它改變所指向對象的值。所謂指向常量的指針,僅僅要求不能經過該指針改變對象的值,而沒有規定那個對象的值不能經過其餘途徑改變。

二、第二種方法和第一種徹底同樣,因此請忘掉它,只用第一種便可。
指針

三、這種指針被叫作常量指針,這裏的const能夠看做是用來修飾p的,就是說此處的指針是一個常量指針,一旦被建立,它所指向的地址就不能再改變,因此要在定義的時候初始化。code

p = &b;//錯誤,由於p是靜態指針,已經指向了a的地址,不能再改變
&p = b;//正確,p不是指向const對象,而是指向int型的a,a是變量  PS:要想存放常量對象的地址,只能使用指向常量的指針

四、p是一個指向常量對象的常量指針。至關於前面的綜合,既不能改變指針的指向,也不能經過指針改變它指向對象的內容。對象



關於constexpr:編譯器

常量表達式(const expression)是指值不會改變而且在編譯過程就能獲得計算結果的表達式。io

C++11新標準規定,容許將變量聲明爲constexpr類型以便由編譯器來驗證變量的值是不是一個常量表達式。聲明爲constexpr的變量必定是一個常量,並且必須用常量表達式初始化。編譯

在constexpr聲明中若是定義了一個指針,限定符constexpr僅對指針有效,與指針所指的對象無關:class

const int *p = nullptr; //p是一個指向整型常量的指針
constexpr int *q = nullptr; //q是一個指向整數的常量指針

p和q相差甚遠,p是一個指向常量的指針,而q是一個常量指針。由於constexpr把他所定義的對象置爲了頂層const變量

constexpr int i = 100;
constexpr const int *p = &i; //p是常量指針,指向整型常量i
相關文章
相關標籤/搜索