指针和常量
前言
C和C++中指针用的很重要,其中关于const 和指针的结合很容易迷惑,这里做一个总结,一般指针和常量const结合会出现以下三种情况:
1、const int *point;
2、int *const point;
3、const int *const point;
以下我们说明下以上三种情况,具体代表什么含义以及如何理解。
顶层const和底层const
关于以上三种情况都存在const,那么这几种const有没有什么含义勒,我们先了解一个顶层和底层const的概念。指针本身是一个对象,它又可以指向另一个对象。因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个独立的问题。因此名词顶层const表示指针本身是个常量,而用名词底层const表示指针所指向的对象是一个常量。
更一般的顶层const还可以表示任意对象是常量,这点对于任何数据类型都是适用的。而底层const一般只对于指针和引用等复合数据类型的基本部分有关。
例:
int i = 0;
int *const p1 = &i;//p1的值不可改变,此处的const为顶层const
const int j = 1;//j的值不可以改变,此处的const为顶层const
const int *p2 = &j;//p2可改变,但是p2所指向的内容不可变,此处const为底层const
const int *const p3 = p2;//第一个是底层const,第二个是顶层const
//注意:如果定义一个指针为 const int *p4 = &i;虽然i是一个变量,但是对*p4赋值是不合法的。
指向常量的指针(const int *point)
将指针定义为指向常量的指针,这意味着不能通过指针修改他所引用的值。
例如:
const int i = 0;
const int *point = &i;
指向常量的指针的const是一个底层const表示指针指向的值是不可修改的,但是指针变量本身是可以修改的。
const int j = 100;
point = &j;//合法
*point = 200;//不合法
指向非常量的常量指针(int *const point)
将指针定义为指向非常量的常量指针,这意味着指针变量不可被改变。
例如:
int k = 2
int *const f = &k;
指向非常量的常量指针的const是一个顶层const表示指针本身是一个常量,其值不可被修改,但是其指向的值可以被修改。
*f = 200;//合法
f = &j;//不合法
指向常量的常量指针(const int *const point)
将指针定义成一个指向常量的常量指针,这意味着不仅指针本身不可以被修改而且指针所指向的值也是不可以被修改i的。
例如:
const int x1 = 100;
int x2 = 200;
const int *const y1 = &x1;
const int *const y2 = &x2;
//这里y1和y2都是指向常量的常量指针
指向常量的常量指针第一个const(从左到右)是低层const,第二个const是顶层const,指针本身不可修改并且所指向的值也不可修改。因此对指向常量的常量任何赋值操作都是非法的
如何判断一个指针的类型
了解上了上述const和指针结合的类型,那么我们应该如何判断一个指针到底是哪一个类型呢?一开始可能会搞得很迷,用多了自然就记住了,在用的不多情况下我们按照下面这个方法来确定:
左结合理解或者是倒过来读法即,
1、pci 是一个变量 const int *pci;
2、pci是一个指针变量 const int *pci;
3、pci是一个指向整数的指针变量 const int *pci;
4、pci是一个指向整数常量的指针变量 const int *pci;
注:参考《深入理解C指针》