个人根据一些资料,简要总结如下:
常量指针(const pointer):必须初始化,一旦初始化完成,那么就不能改变它的指向了。可以通过它改变指向的地址所存的值。把*放在const关键字之前用以说明该指针是一个常量。
指向常量的指针:可以改变它的指向。不能通过它来改变指向的地址所存的值。
指向常量的常量指针:不可以改变它的指向。不能通过它来改变指向的地址所存的值。
#include <iostream>
using namespace std;
int main()
{
const int a = 0;
const int b = 1;
int c = 2;
//可以声明指向常量的指针。可以改变它的指向,不能通过它来改变指向的地址所存的值。
const int *p1 = &a;
p1 = &b; //正确。d是指向常量的指针,能改变其指向。
*p1 = 9; //错误。d是指向常量的指针,不能修改其指向对象的值。
//可以声明指针类型的常量。不能改变它的指向,可以通过它改变指向的地址所存的值。
int *const p2 = &c;
*p2 = 9; //正确。p2是指针常量,能修改其指向对象的值。
p2 = &b; //错误。p2是指针常量,不能改变其指向。
//可以声明指向常量的指针型的常量。不可以改变它的指向。不能通过它来改变指向的地址所存的值。
const int *const p3 = &a;
*p3 = 9; //错误。理由类上。
p3 = &b; //错误。理由类上。
return 0;
}
补充:
1、constexpr变量简介:
在C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
2、指针和constexpr:
在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关:
const int *p=nullptr; //p是一个指向整型常量的指针
constexpr int* q=nullptr;//q是一个指向整形的常量指针,等同于int *const q=nullptr;
3、与其他常量指针类似,constexpr指针既可以指向常量也可以只想一个非常量:
constexpr int *np=nullptr; //np是一个指向整数的常量指针,其值为空
int j=0;
constexpr int i=42; //i的类型是整型常量