C++ 中的指针和const

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午11:39
下一篇 2023年2月9日 上午11:39

相关推荐