C++中的指针的使用是非常灵活的,const关键字的作用与其字面意思相同“常量,不变的量”,二者结合起来的用法有两种:
第一种方法是让指针指向一个常量对象——可以修改指针的指向(即指针本身的值),不可以通过指针修改所指对象的值;
第二种方法是将指针本身声明为常量——不可以改变指针的指向
先了解一下第一种方法
int a = 1;
const int* pa = &a;
上面代码中pa是一个指向常量的指针,虽然a没有声明为const常量,但是不可以通过pa来修改a的值,也就是说pa的值是const,不能被修改。
进一步看这段代码:我们发现可以将一个非const常量地址赋给一个指向该类型的常量的指针,也就是说“指向常量的指针——既可以指向常量,也可以指向非常量”*
上面的代码中,可以直接修改a的值,但不可以通过指针pa来修改a的值:
int a = 1;
const int* pa = &a;
a = 2; //OK
*pa = 2; //INVALID
第二种方法相对好理解:
int b = 1;
int* const cpb = &b;
很明显const关键字的位置和第一种情况不同,const的位置更接近于指针的名字:cbp,此时不能修改cpb的值让它指向另外一个int变量,但是可以通过指针来修改b的值。
最后总结一下const变量、非const变量、const指针和非const指针之间的关系:
非const变量的地址 可以 赋给指向const的指针;
const变量的地址 可以 赋给指向const的指针;
非const变量的地址 可以 赋给常规指针;
const变量的地址不可以赋给常规指针;
记忆方法是常规变量地址可以赋给常规或非常规的指针,const变量地址只能给指向const指针,不能给常规指针。
在实际编程中的做法是尽可能的使用const,这样既可以防止无意中修改数据,又可以接受const和非const的对象地址。
在进一步深入,上面的讨论只涉及到一级间接关系——指针只是指向基本的数据类型,如果将一个指针的地址赋给另一个指针时的情况会怎样呢?
1 const int a = 1;
2 int* pa;
3 const int **ppa;
4
5 ppa = &pa; //INVALID
6 *ppa = &a; //OK
第四行代码试图将一个非const的int转换成const的int,会导致编译错误,因此在二级间接关系中,不能将常规地址赋给const指针。
原文链接: https://www.cnblogs.com/zheng-hong-bo/archive/2012/10/07/2714496.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/65017
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!