指针与const关键字
1 指向常量的指针
指向常量的指针(pointer to const)
这种指针不能用于改变其所指对象的值
一般情况下,指针类型必须与其所指对象的类型一致,但是也有例外:
- 允许一个指向常量的指针指向一个非常量对象
- 这里好好理解一下
指向常量的指针
:本质上是,这个指针,所指向的这个量不能变,而不是说这个指针不能指向别的内容了 。
-咱就是说,只要我指针指向的这个常量a的值不被改变就行了!但是,我这个指针可以不指向这个常量,我可以指向其他的内容,这没有任何问题。 - 注意和常量指针区分。
- 这里好好理解一下
const double pi = 3.24; //pi是一个常量,它的值不能改变
double *ptr = π
//第二行定义错误,ptr只是一个普通的指针变量,不能直接指向常量
const double *cptr = π
//第5行定义正确,cptr是一个可以指向常量的指针
*cptr = 42;
//第8行错误,不能给*cptr赋值
//因为*cptr是一个常量,常量不能被赋值
double dval = 3.14; //变量dval的值是3.14
cptr = &dval;//让指向常量的指针指向一个变量的地址,没有问题
2 const指针(常量指针)
- 常量指针必须初始化
- 初始化完成,那存放在指针中的那个地址就不能被改变了
注意看下面的代码:
放在了const关键字之前,说明指针是一个常量,
这样书写的意思是:不变的是指针本身而不是指向的那个变量所保存的值
(下面代码注释看明白就够了)
int errNumb = 0;
int *const curErr = &errNumb;
//curErr将永远指向&errNumb
//本质上是,curErr这个东西,给他分配的内存里存放的是errNumb的地址,
//那curErr就一直存放,这个地址不能再存别的地址啦
const double pi = 3.14;
const double *const pip = π
//第8行,属于是buff叠满了,表示什么呢?
//表示pip是一个指向常量的常量指针。这又是啥意思呢?
//首先,不能用pip指针去修改常量pi
//其次,pip指针只能指向pi的地址,不能再指向别地址啦。
3 指向常量的指针
和指针常量
在形式上的区别
指向常量的指针: const在*
的左边
指针常量: const在*
右边
注意:
是常量指针还是指向指针的常量只和
const与*的相对位置有关
与const与函数返回值的相对位置无关
//这两个都是指向常量的指针
int a = 10;
const int * ptr = &a;
int const * ptr = &a;
//这个是指针常量
int * const ptr = &a;