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 即指针常量

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值