指向常量的指针
指针可以指向常量或者非常量,其中指向常量的指针意思是指针所指的对象是一个常量,所以我们不能通过指向常量的指针来改变指针所指的对象的值。如果想要存放常量对象的地址,就只能使用指向常量的指针。
下面是指向常量的指针的定义:
const int a = 520; //初始化一个整型常量且值为10
const int* p1 = &a; //指针p1用来指向const int对象也就是整型常量
//也可以写成下面形式
//int const* p1 = &a;
指向常量的指针可以指向非常量对象,但普通指针不能指向常量对象。
int b = 520; //初始化整型变量b的值为520
p1 = &b; //让整型常量指针p1指向非常量b,这是合法的
// int* p2 = &a; 这是非法的操作
常量指针
指针和引用不同,指针是一个对象,所以也就允许将指针定义为一个常量。指针常量必须初始化,就像其他常量一样。也就是说,常量指针一旦被初试后,这个指针将一直指向在初始化时被规定的那个对象。指针所存的地址将不会再改变。
下面是常量指针的定义:
int c1 = 10; //初始化整型变量c1,值为10
const int c2 = 20; //初始化整型常量c2,值为20
int* const p2 = &c1; //初始化常量指针p2用来指向int对象c1
const int* const p3 = &c2; //初始化常量指针p3用来指向const int的对象c2
p2与p3都是常量指针,将不变的保存他们所指向的对象的地址。
指向常量的指针与指针常量的区别
首先我们需要分辨出哪个是指向常量的指针,哪个是指针常量。
我个人使用的方法,是根据星号“ * ”以及const的位置来进行判断。
const int* p = &a;
int const* p = &a;
从等号开始看起,等号左边的p是指针名,再往左看,如果p和星号之间没有别的关键字了,说明这是一个指针p。再看星号左边,星号左边的关键字说明了该指针指向一个什么样的对象。上例说明指针p用来指向const int类型的对象。
const int* const p = &a;
int* const p = &a;
再次从等号向左边看,发现p与星号之间出现了const关键字,这说明指针p是一个常量指针。然后星号左边的关键字表示了该常量指针指向一个什么类型的对象。
指向常量的指针与指针常量的区别在于:
指向常量的指针,该指针本身可能不是一个常量对象,但指向的对象是一个常量,这就说明我们可以让指针现在指向常量a,过一会儿指向常量b但是无法通过该指针来修改它所指向的常量。
常量指针,说明该指针就是一个常量,我们不能改变该指针所指向的是哪个对象。