在C++中,const修饰符一般用于修饰常量。常量在定义的时候必须初始化,而且值一旦定义之后就不能修改,这样就能保证常量的值在程序运行过程中不会发生变换。

1.指向const对象的指针

  指向const对象的指针本身的指向可以发生变换,但是不可以通过该指针修改所指向变量的值。指向const对象的指针在定义的时候无需初始化,而且这种类型的指针也可以指向普通变量,只不过不能通过该指针修改对应变量的值,即便对应变量不是常量。指向常量的指针在类型标识符前必须有const修饰符修饰,否则编译不通过。

  指向const对象的指针的定义与用法如下所示:

const int a=;
int b=; //指向常量的指针在定义时无需初始化
const int *cptr;
//将const放在类型前面或者后面,二者的意义完全相同
int const *cptr; int *ptr;
cptr= &a; *cptr = ;
//非法,不能通过该指针修改指向变量的值 cptr =&b;
*cptr = 3;
//非法,不能通过该指针修改指向变量的值,即便指向的变量不是常量 ptr =&b;
*ptr=;
//合法! ptr =&a;
//非法,指向常量的指针强制要求在类型标识符前使用const修饰符,否则编译不通过

2.const 指针

  const指针本身是常量,其值必须在定义时初始化,且const指针指向的地址在初始化之后无法修改。const指针不能指向常量(除非是指向const对象的const指针),但是可以通过const指针修改其指向的变量的值。

  const指针的定义及用法如下所示:

int a=;
const int b=; int *const cptr;
//非法,const指针在定义时就要初始化 int *count cptr=&b;
//非法,const指针不能指向const对象,除非该指针是指向const对象的const指针 int * const cptr =&a;
*a=;
//可以通过const指针修改其指向的变量的值

3.指向const对象的const指针

  指向const对象的const指针同时具有1和2中指针的属性。首先不能通过该指针改变其指向对象的值,即便其指向的对象是常量(还是可以指向一般变量的,只是不能通过该指针修改指向的变量的值);另外该指针的值一旦初始化,之后不能修改,而且该指针的值必须在定义时初始化。

  指向const对象的const指针的定义及使用如下所示:

const int a =;
int b=; const int * const cptr;
//非法,必须在定义时初始化 const int * cosnt cptr =&a;
int const * const cptr =&a;
//上述两种顺序的定义意义完全一致 const int * const cptr_1 =&b;
//可以指向一般变量 *cptr_1 =;
//非法,不能通过该指针改变其指向的对象的值,即便指向的对象不是常量 *cptr=;
//非法,不能通过该指针改变其指向的对象的值

 

附录:指针和typedef

  设使用typedef定义了下述数据类型:

typedef string * pstring;
const pstring cstr;
pstring const cstr1;

  那么cstr和cstr1真实的数据类型是什么?此时需要认识到const修饰的是pstring的类型,这是一个指针,所以const是直接修饰指针的!因而cstr和cstr1的数据类型都是——

string * const ptr;

参考:C++ Primer 3rd

 

C++指针与const的更多相关文章

  1. 指向const的指针和const指针

    1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...

  2. C++中的指针与const

    刚开始接触C++时,指针和const之间的关系有点混乱,现在总结如下: 一.指向const变量的指针 #include<iostream.h> void main() { const in ...

  3. C++ Prime:指针和const

    与引用一样,也可以令指针指向常量或非常量,类似于常量引用,指向常量的指针不能用于改变其所指对象的值.要想存放常量对象的地址,只能使用指向常量的指针: const double pi = 3.14; / ...

  4. 指针和Const限定符

    指针和Const限定符 1.指向const对象的指针 如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针具有const特性. const d ...

  5. void指针和const指针

    void指针:主要是便于传递不同类型的参数 const指针: const char *p :const 在* 的左边表示指向一个常量指针:表示指向的内容不可变(*p不能变,p可以改变) int a = ...

  6. [C++ Primer Plus] 第7章、函数(一)程序清单——递归,指针和const,指针数组和数组指针,函数和二维数组

    程序清单7.6 #include<iostream> using namespace std; ; int sum_arr(int arr[], int n);//函数声明 void ma ...

  7. 不能将“this”指针从“const SqQueue<ElementType>”转换为“SqQueue<ElementType> &

    错误 1 error C2662: “int SqQueue<ElementType>::getLength(void)”: 不能将“this”指针从“const SqQueue<E ...

  8. 指针和const一些注意事项

    1.常量指针(底层const) 指向常量的指针,指针所指向的对象的值无法被修改,若想存放常量对象的地址,只能使用指向常量的指针. 2.指针常量(顶层const) 指针本身是常量,指针本身的值不可修改. ...

  9. 【C】——指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种. const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所 ...

随机推荐

  1. 免费vpn:SoftEther VPN

    Google it. 注意下载2.0版的,不要下载最新版的.

  2. test命令

    每一种条件语句的基础都是判断什么是真什么是假.是否了解其工作原理将决定您编写的是质量一般的脚本还是您将引以为荣的脚本.Shell 脚本的能力时常被低估,但实际上其能力的发挥受制于脚本撰写者的能力.您了 ...

  3. Allocation Failure

    up vote 8 down vote accepted "Allocation Failure" is a cause of GC cycle to kick. "Al ...

  4. cs的变态语法

    int? a = null; //?指示a为可空checked { ... } //赋值溢出抛异常unchecked { ... } //赋值溢出不抛异常expr1??expr2 //空结合运算符,e ...

  5. JS清除dropdownlist绑定的项,并添加新项

    <script type="text/javascript"> /*删除项*/ document.getElementById('KeyList').options.l ...

  6. 何查询SQL Server数据库没有主键的表并增加主键

    SQL Server数据库中,如果一个表没有主键,我们该如何查询呢?本文我们主要就介绍了如何查询数据库中没有主键的表名并为其增加主键的方法,希望能够对您有所帮助. 该功能的实现代码如下: declar ...

  7. FZU 2168 防守阵地 I(前n项和的前n项和)

    这是一道很容易超时的题,我超了n次了,后来队友提示我才想到,bigsum ! ! ! !就是前n项和的前n项和 #include<iostream> #include<cstdio& ...

  8. POJ 1185炮兵阵地 (状压DP)

    题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...

  9. nginx 红黑树详解

    1 介绍 这部分终于整理完了,太耗时间了,留下来备忘吧! 之前看STL源码时,只是研究了红黑树的插入部分.在stl源码剖析的书中,也没有涉及到删除操作的分析,这次对删除操作也进行了详细的研究, 并且还 ...

  10. 三种Dataase Mapping的系统架构

    ORM - O/R M - Object/Relational Mapping: A technique/idea used to map objects and thier individual r ...