在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. 第19章 网络通信----UDP程序设计基础

    用户数据报协议(UDP)是网络信息传输的另一种形式. 基于UDP通信的基本模式如下: (1)将数据打包(称为数据包),然后将数据包发往目的地. 发送数据包: 使用DatagramSocket()创建一 ...

  2. 让shell 变得容易理解

    1.重建你的语义模型(简单语义模型)2.变量,参数和方法命名3.测试用例4.足够的组块

  3. 2016沈阳网络赛 odd-even number

    odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. ListView遍历每个Item出现NullPointerException的异常处理(转)

    在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...

  5. html5中的postMessage解决跨域问题

    解决跨域问题的方法有很多,如:图像ping(简单).jsonp(缺点是不能实现跨域post).CROS(CORS的本质让服务器通过新增响应头Access-Control-Allow-Origin,通过 ...

  6. NanoApe Loves Sequence Ⅱ(尺取法)

    题目链接:NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 ...

  7. 【翻译】go语言中的map实战

    业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...

  8. ubuntu下mysql 开启远程连接

    一.修改配置文件: vim /etc/mysql/my.cnf,找到 bind-address = 127.0.0.1 注释掉这行,如: #bind-address = 127.0.0.1 或者改为: ...

  9. myEclipse 8.5下SVN环境的搭建

    myEclipse 8.5下SVN环境的搭建 在应用myEclips 8.5做项目时,svn会成为团队项目的一个非常好的工具,苦苦在网上寻求了一下午,终于整合好了这个环境,在这里简单介绍下,希望能为刚 ...

  10. javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...