系列文章目录:
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 !
如果是一个指针,则指针保存的值不可被更改,即常量指针 ↩︎