在C++学习过程使用中,每个人都不可避免的会把指针错误理解或在不理解,尤其是对指针常量和常量指针的理解,特别容易把概念搞混淆。本文就针对该问题简单的说说指针常量和常量指针的区别。
指针常量
本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。
特征:
- 是个常量。
- 指针锁保存的地址可以改变,但指针指向的值不能改变。
- 指针本身是常量,指向的地址不可以变,但指向的地址所对应的内容可以变。
形式如下:
int* const p;
常量指针
常量指针又叫常指针,可以理解为常量的指针,也就是这个是指针,但指向的是常量,这个常量是指针的值(地址),并不是地址指向的值。
特征:
- 常量指针指向的对象不能通过这个指针来修改,可以通过原来的声明修改。
- 常量指针可以被赋值为变量的地址,之所以叫常量指针,就是限制了通过这个指针修改变量的值。
- 指针还可以指向别处,因为指针本身只是一个变量,可以指向任意地址。
形式如下:
int const* p;
const int* p;
指向常量的常指针
指向常量的指针常量是一个常量,且所指向的对象也是一个常量。
特征
- 一个指针常量,指向的是一个指针对象;
- 它所指向的指针对象且是一个常量,即指向的对象不能变。
形式如下:
const int* const p;
如何区别这些呢?
区分宝典
方式一
看*和const的排列顺序,如下:1
2
3int const* p; //const* 常量指针
const int* p; //const* 常量指针
int* const p; //*const 指针常量
方式二
看const离谁近,即从右往左看,如下:1
2
3int cont* p; //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改。
const int* p; //和上面一样
int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改
看一个实例
1 | //-------常量指针------- |
在实际应用中,常量指针要比指针常量用的多,比如常量指针经常用在函数传参中,以避免函数内部修改内容。
size_t strlen(const char* src); //常量指针,src的值不可改变;
char a[] = "hello";
char b[] = "world";
size_t a1 = strlen(a);
size_t b1 = strlen(b);
虽然a、b是可以修改的,但是可以保证在strlen函数内部不会修改a、b的内容。