C++中常量指针和指针常量以及常对象指针等概念的理解

在C++学习过程中,指针是极其重要的一部分内容,很多人都或多或少的接触过常量指针或指针常量,但是对这些概念却非常头疼。
本文主要介绍常量指针和指针常量,并介绍常对象指针及相关方面的归纳总结。

常量指针

定义:

      又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。

 关键点:

      1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
      2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
      3.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
//    对于第1,2点,可以看以下代码帮助理解:
double a=1.00;
const double * ptr=&a;
//  *ptr=10.00;  
//这一段如果不注释掉,在DevC++中,会报错[Error] assignment of read-only location '* ptr'
a=10.00;  
//虽然不能通过常量指针修改,但是若变量本身不是常变量,那么依然可以修改其值


//    对于第3点, 可以看以下代码:
double b=2.00;
ptr=&b;  
//这一句也就说明了,常量指针ptr可以指向其他的量,当然,指向其他量之后依然需要遵循第1,2两点

代码形式:

 int const* ptr;  const int* ptr;

指针常量

定义:

     本质是一个常量,而用指针修饰它。指针常量的值是指针,即这个指针的所保存的地址值是不能再修改的。 

    关键点:

          1.它是个常量!
          2.指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
          3.指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;

代码形式:

  int* const ptr;  //读作指针常量
//借助以下代码理解上面的关键点
double a=1.00;
double *const ptr=&a;
//为指针常量,说明ptr的地址值必须在创建时就初始化并且不再改变,但是*ptr是可以被改变的
cout<<*ptr<<endl;
*ptr=2.00;
cout<<*ptr<<endl;

指向常量的常指针

定义:

指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。
         关键点:

 1.一个指针常量,指向的是一个指针对象;
 2.它指向的指针对象且是一个常量,即它指向的对象不能变化;

代码形式:

 const int* const ptr;
 //此处的ptr地址值不能改变,而且也不能通过ptr来修改其指向的值
double a=1.00;
const double *const ptr=&a;
//*ptr=2.00;  [Error] assignment of read-only location '*(const double*)ptr'
cout<<*ptr<<endl;
a=2.00;
//虽然不能通过指针修改,但是依然可以直接修改a (a不是常量) 的值,*ptr也会随之被刷新为2
cout<<*ptr<<endl;

附上一个选择题来加深理解:
要禁止修改指针p本身,又要禁止修改p所指向的数据,这样的指针应定义为()
A. const char *p=“ABCD”;
B. char *const p=“ABCD”;
C. char const *p=“ABCD”;
D. const char * const p=“ABCD”;

正确答案为D
这些概念确实容易混淆,下面介绍一些方法帮助记忆

  1·
  看const离谁近,即从右往左看,比如:
 int const* p; //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改;
 const int* p; //同上
 int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改;
  2·
  看 * 和 const 的排列顺序,比如:
 int const* p; //const * 即常量指针
 const int* p; //const * 即常量指针
 int* const p; //* const 即指针常量

有了上面的理解,再来理解一下常对象指针和区分指向对象的常指针和常对象的指针

原文链接: https://www.cnblogs.com/zeroonegame/p/15037313.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++中常量指针和指针常量以及常对象指针等概念的理解

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/335867

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

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

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

(0)
上一篇 2023年3月1日 下午10:21
下一篇 2023年3月1日 下午10:21

相关推荐