const

pointer to const:指向常量的指针(被指向的对象是常量)

const pointer:常量指针(指针本身是常量)

 

     [对被指向对象的修饰] * [指针本身的修饰]

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

指向常量的指针:被指向的对象是常量,修饰的是被指向的对象。

不能用于修改其所指对象的值(被指向的对象是常量)。

const int s32val = 5;//常量

const int *pint = &s32val;//const在*前,那么说明被指向的对象是const int型。*pint是不能改变。(pint是可以改变的,但是改变没有意义。)

 s32val是常量,pint是指向常量的指针。

例外:允许一个指向常量的指针  指向  一个非常量对象。

指向常量的指针也没有规定其所指的对象必须是一个常量。只是规定不能通过该指针改变指向对象的值。

------------------------------------------------------------

常量指针:指针本身是常量,指针不能改变。和常量定义意义,必须初始化

int x = 10;

int *const pint = &x;//const在*后面,修饰pint,所以pint是常量,不能改变,但是*pint是可以改变的。

 可以*pint = 12;这样的方式去修改,但是不能pint++,这类操作。

------------------------------------------------------------

指向常量的常量指针

const int *const pint = &x;

==========

top-level const:指针本身是常量(*右边)

low-level const:指向的对象是常量(左边*)

记忆方法,尊右为顶。

==========

c++11的新规定:

constexpr类型。

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

const int max=30;

const int mmax = max+1;

是常量表达式。

int unstat = 11;

int getval = val();

不是常量表达式,unstat是普通int类型,val()不是在编译阶段就能确定的值。

用constexpr验证:

constexpr int mf = 20;

constexpr int limit = mf+1;

constexpr int sz = getval();只有getval是一个constexpr函数,才是正确声明。

原文地址:https://www.cnblogs.com/jsgnadsj/p/5094009.html