指针常量和常量指针

指针常量和常量指针

指针常量和常量指针总是傻傻的记不清楚,或者好不容易记住了,结果过一段时间又混淆了二者之间的概念,接下来帮你理清这两者之间的概念。

这两个概念在C/C++中经常被混淆,但它们之间的含义截然不同,核心在于'const'修饰的是谁。

指针常量

指针常量又称为(const pointer),'const'修饰的是pointer。因此指针的指向不能改变,指针所指向内存中的值可以被修改。

int a = 10, b = 20; int * const p = &a; *p = 20; //ok,指针指向地址的值可以被修改; p = &b; //error,指针指向的地址不能改变。

常量指针

常量指针又被称为(point to const),'const'修饰的是数据类型(如'int')。因此指针的指向可以改变,指针指向的值不能被修改。

int a = 10, b = 20; const int * p = &a; int const * p = &a; //二者等价 p = &b; //ok,指针指向的地址可以改变; *p = 20; //error,指针指向地址中的值不能改变。

二者叠加

上面两者方式叠加,我管它们叫做“常量指针常量”(const pointer to const),结合了两者的特点。既不能改变指针的指向, 也不能改变指针指向地址中的值。

int a = 10, b = 20; const int * const p = &a; int const * const p = &a; //二者等价 *p = 20; //error,不能改变指针指向地址的值; p = &b; //error,不能改变指针的指向。

总结

能改变指针指向(p)能改变值(*p)
指针常量(const pointer)不能可以
常量指针(point to const)可以不能
常量指针常量(const pointer to const)不能不能

'const'在‘*’的左边,指针指向的地址中的值不能被修改;'const'在’*‘的右边,指针的指向不能被修改,记忆技巧:左定值,右定向。