C++详解:常量指针&指针常量

系列文章目录:

C++指针(1)
C++指针(2)
C++常量(1)
C++常量(2)



前言

  在前面的文章中,我们分别认识了 常量指针,这次,我们会将他们结合起来,认识C++中的常量指针指针常量


一、指向常量的指针

const int N=0x7fffffff;//定义常量
int* ptr=&N;//定义指针ptr,指向常量N

std::cout<<N<<endl;
std::cout<<*ptr<<endl;

运行:
E0144 & C2440
可以看到,编译器无法将指向const int的指针(&N)赋值给指向int的指针(ptr)。解决方法有两种:

  1. 显式转换类型:将代码改为:
int* ptr=(int*)&N;

将(const int*)&N转为int*,结果:

2147483647
2147483647
  1. 源代码中ptr为指向常量非常量指针,即指针中保存的值可改变,但它指向的值是一个不可更改的常量。我们可以直接将ptr定义为:
const int* ptr=&N;

 指针常量总结

  指针常量可分为指向常量的常量指针和指向常量的非常量指针。前者指针保存的地址和地址上的值都不可被改变,即ptr=...*ptr=...都是不合法的,而后者可以改变保存的地址(即指向的位置),却不可以改变地址的值,因此ptr=...合法而*ptr=...不合法。

二、指向非常量的指针

  指向非常量的非常量指针就不提了,就是正常的指针,主要讲指向非常量的常量指针。

int N=12345;
const int* ptr=&N

在这种情况下,指针本身保存的地址不可更改,即ptr一直会指向N,但*ptr+=5N+=5一样吗?不一样,编译器会提示*ptr+=5要可更改的左值,可以使用vs的监视功能:
二者类型不同
可以看到,*ptr被解指针后是const int,不可被更改。

 常量指针总结

  一个指针本身是常量,那么它保存的地址和地址上的值(以*解指针访问时)都不可被更改。
:以上提到的指针都是底层指针。

三、底层const和顶层const

  • 底层const:表示该量本身不可被更改1。定义方式如下:
const int i;
const float* fl;
const double** db;
const char * const * ch;

可以看出,底层const以const开头,并且结尾不是const。

  • 顶层const:指针指向的值不可被更改。

四、const*的组合

先来看一串定义:

int x=12345;
int* p=&x;
int* const pc=p;
int* const* pcp=&pc;
int * const * const pcpc=pcp;

想要理解,我们先要知道const intint const是一样的,我们可以先typedef int* INTPTR;则代码变为了:

int x=12345;
INTPTR p=&x;
INTPTR const pc=p;//即const INTPTR

多更改几次:

typedef int* intptr;
typedef const intptr Cintp;//const intptr就是intptr const就是const int*
typedef Cintp* Cintpp;//即int* const *
typedef const Cintpp CCintpp;//int* const * const

这下应该更容易理解了.
vs的监视功能也可以帮助理解:
解指针和解常量


-----THE END-----
THANK YOU !


  1. 如果是一个指针,则指针保存的值不可被更改,即常量指针 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值