指针和const
允许让一个指向常量的指针指向一个非常量1
2
3
4
5int i = 0;
const int *p = &i; //定义一个指向常量的指针
cout<<*p<<endl; // 0
i = 100;
cout<<*p; // 100
const 指针
一个指向常量的指针是指针可以变,但是指针指向对象的值不能通过指针改变;const 指针是指,指针本身是一个常量,即不能改变指针所指向的地址,但是指针指向对象的值可以改变。1
2
3
4int i = 0;
int *const p = &i;
*p = 100;
cout<<i; // 100
顶层const
用顶层const来表示指针本身是常量,用底层const来表示指针所指向的对象是常量。1
2
3
4
5
6int i = 0;
int *const p1 = &i; //顶层const
const int ci = 42;
const int *p2 = &ci; //底层const
const int *const p3 = p2; //右const是顶层const,左const是底层const
const int &r = ci; //用于声明引用的const 都是底层const
constexpr和常量表达式
常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。1
2const int c = get_size(); // 不是常量表达式
int i = 10; // 不是常量表达式
一般,如果一个变量是一个常量表达式,那么把它声明成constexpr类型
constexpr指针的初始值必须是nullptr或者是0,或是储存于某个固定地址中的对象。
函数体内定义的变量一般来说不是储存在固定地址,因此不能用来初始化constexpr指针;定义在所有函数体外的对象的储存地址固定不变,可以初始化constexpr指针。
指针与constexpr
区别:
``` bash
const int p = nullptr; //指向 整形常量 的指针
constexpr int q = nullptr; //指向整形的 常量指针
constexpr const int *p1 = &j //p1是 常量指针 ,指向 整形常量 j
