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

系列文章目录:

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


文章目录

  • 前言
  • 一、指向常量的指针
    •  指针常量总结
  • 二、指向非常量的指针
    •  常量指针总结
  • 三、底层const和顶层const
  • 四、`const`和`*`的组合


前言

  在前面的文章中,我们分别认识了 常量指针,这次,我们会将他们结合起来,认识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. 如果是一个指针,则指针保存的值不可被更改,即常量指针 ↩︎

你可能感兴趣的:(C++干货系列,#,C++干货,常量与指针,c++,c语言,指针)