指针与constexpr

发布时间 2023-05-17 16:49:45作者: imxiangzi

一、

常量表达式:是指值不会改变并且在编译过程就能得到的计算结果的表达式。

定义常量表达式变量:

constexpr 变量类型 变量名;

例如:

constexpr int mf=20;/////20是常量表达式

constexpr int limit=mf+1;/////mf+1是常量表达式

constexpr int sz=size();//////错误:size()只有到运行时才能获取到

 

 

二、

     指针和引用都能定义为constexpr,但是他们的初始值却受到严格限制。一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。

     const int *p=nullptr;////p是一个指向整型常量的指针

     constexpr int *q=nullptr;/////q是一个整数的常量指针

注意:p和q相差甚远,p是一个指向常量的指针,q是一个常量指针,其中关键在于constexpr把它所定义的对象置为了顶层const。

补充:顶层const指定义了一个常量指针,底层const指定义了一个指向常量的指针。

 

 

========================================

在定义一个指针时,可以添加一个constexpr关键字修饰,这样的指针称为constexpr指针;需要注意的是constexpr只对指针有效,与指针所指对象无关,这句话的意思是constexpr修饰的指针是一个指向变量的常对象,指针的方向不能改变,指向的对象可以改变

值得知道的一点是:constexpr指针时编译期常量,其指向定义时的初始值确定后不能发生改变,所以我们需要定义所有函数体之外的固定位置不变的,用来初始化constexpr指针,可以时全局变量,全局常量,静态变量等等

我们接下来可以用代码来表示:

#include <iostream>

using namespace std;

 

//指针与constexpr

int i = 10;//全局变量

constexpr int j = 10;//全局常量

int main01()

{

//int i=1;//无固定地址

constexpr int* p = &i;//初始化时需要取地址

i = 3;

//只要地址不变对指针的值就无影响

cout << "p指向的对象的值:" << *p << endl

<< "p指向的地址:" << p << endl;

//================

constexpr  const int *q = &j;

cout << *q << endl;

static char x = 'X';//局部静态变量

constexpr char *m = &x;

cout << *m << endl;

system("pause");

return 0;

}

 

 

from:https://blog.csdn.net/m0_46434080/article/details/109138348

           https://blog.csdn.net/aa6272737/article/details/125038354

 

https://www.cnblogs.com/cynthia-dcg/p/6057227.html