系列文章目录:
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;
运行:

可以看到,编译器无法将指向const int的指针(&N)赋值给指向int的指针(ptr)。解决方法有两种:
- 显式转换类型:将代码改为:
int* ptr=(int*)&N;
将(const int*)&N转为int*,结果:
2147483647
2147483647
- 源代码中ptr为指向常量的非常量指针,即指针中保存的值可改变,但它指向的值是一个不可更改的常量。我们可以直接将ptr定义为:
const int* ptr=&N;
指针常量总结
指针常量可分为指向常量的常量指针和指向常量的非常量指针。前者指针保存的地址和地址上的值都不可被改变,即ptr=...和*ptr=...都是不合法的,而后者可以改变保存的地址(即指向的位置),却不可以改变地址的值,因此ptr=...合法而*ptr=...不合法。
二、指向非常量的指针
指向非常量的非常量指针就不提了,就是正常的指针,主要讲指向非常量的常量指针。
int N=12345;
const int* ptr=&N
在这种情况下,指针本身保存的地址不可更改,即ptr一直会指向N,但*ptr+=5和N+=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 int和int 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的监视功能也可以帮助理解:

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

本文深入探讨了C++中指针和常量的结合,包括指针常量的概念、不同类型指针的特性和底层const与顶层const的区别。通过实例演示了常量指针和指针常量的应用,并通过VS监视功能揭示其行为差异。
498

被折叠的 条评论
为什么被折叠?



