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
相关文章
相关标签/搜索