C++指针与const
在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的更多相关文章
- 指向const的指针和const指针
1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...
- C++中的指针与const
刚开始接触C++时,指针和const之间的关系有点混乱,现在总结如下: 一.指向const变量的指针 #include<iostream.h> void main() { const in ...
- C++ Prime:指针和const
与引用一样,也可以令指针指向常量或非常量,类似于常量引用,指向常量的指针不能用于改变其所指对象的值.要想存放常量对象的地址,只能使用指向常量的指针: const double pi = 3.14; / ...
- 指针和Const限定符
指针和Const限定符 1.指向const对象的指针 如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针具有const特性. const d ...
- void指针和const指针
void指针:主要是便于传递不同类型的参数 const指针: const char *p :const 在* 的左边表示指向一个常量指针:表示指向的内容不可变(*p不能变,p可以改变) int a = ...
- [C++ Primer Plus] 第7章、函数(一)程序清单——递归,指针和const,指针数组和数组指针,函数和二维数组
程序清单7.6 #include<iostream> using namespace std; ; int sum_arr(int arr[], int n);//函数声明 void ma ...
- 不能将“this”指针从“const SqQueue<ElementType>”转换为“SqQueue<ElementType> &
错误 1 error C2662: “int SqQueue<ElementType>::getLength(void)”: 不能将“this”指针从“const SqQueue<E ...
- 指针和const一些注意事项
1.常量指针(底层const) 指向常量的指针,指针所指向的对象的值无法被修改,若想存放常量对象的地址,只能使用指向常量的指针. 2.指针常量(顶层const) 指针本身是常量,指针本身的值不可修改. ...
- 【C】——指针与const限定符
const限定符和指针结合起来常见的情况有以下几种. const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所 ...
随机推荐
- 第19章 网络通信----UDP程序设计基础
用户数据报协议(UDP)是网络信息传输的另一种形式. 基于UDP通信的基本模式如下: (1)将数据打包(称为数据包),然后将数据包发往目的地. 发送数据包: 使用DatagramSocket()创建一 ...
- 让shell 变得容易理解
1.重建你的语义模型(简单语义模型)2.变量,参数和方法命名3.测试用例4.足够的组块
- 2016沈阳网络赛 odd-even number
odd-even number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- ListView遍历每个Item出现NullPointerException的异常处理(转)
在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...
- html5中的postMessage解决跨域问题
解决跨域问题的方法有很多,如:图像ping(简单).jsonp(缺点是不能实现跨域post).CROS(CORS的本质让服务器通过新增响应头Access-Control-Allow-Origin,通过 ...
- NanoApe Loves Sequence Ⅱ(尺取法)
题目链接:NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 ...
- 【翻译】go语言中的map实战
业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...
- ubuntu下mysql 开启远程连接
一.修改配置文件: vim /etc/mysql/my.cnf,找到 bind-address = 127.0.0.1 注释掉这行,如: #bind-address = 127.0.0.1 或者改为: ...
- myEclipse 8.5下SVN环境的搭建
myEclipse 8.5下SVN环境的搭建 在应用myEclips 8.5做项目时,svn会成为团队项目的一个非常好的工具,苦苦在网上寻求了一下午,终于整合好了这个环境,在这里简单介绍下,希望能为刚 ...
- javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...