指针和Const限定符
指针和Const限定符
1.指向const对象的指针
如果指针指向的是const对象,则不允许使用指针来改变其所指的const值。C++要求指向const对象的指针具有const特性。
const double *cptr; //cptr是一个指向double类型const对象的指针。
此处const限定了cptr指针所指向的对象类型,而非cptr本身。即cptr本身并不是const。在定义时,不需要对它进行初始化,若需要,可使cptr指向另一个const对象,但不允许使用cptr来改变所指向对象的值:
*cptr = ; //error
1)把一个const对象的地址赋给非const对象的指针会导致编译时错误:
const double Pi=3.14;
double *ptr = Π //error
const double *cptr = Π //ok
2)不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址:
const int universe = ;
const void *cpv = &universe; //ok
void *pv = &universe; //error
3)允许把非const对象的地址赋值给指向const对象的指针:
double dval = ;
cptr = &dval;
虽然dval不是const对象,但任何企图通过指针cptr修改其值的行为均会导致编译错误。指向const对象的指针一经定义,就不允许修改其所指对象(const对象和非const对象)的值。若指向const对象的指针所指的对象是非const对象,可以使用其他方法更改其值:
dval = 3.1415926;
*cptr = 3.1415926; //error
cptr = &dval;
double *ptr = &dval;
*ptr = 2.72;
cout << *cptr; //输出2.72
故:不能保证指向const对象的指针所指对象的值一定不可以修改。
在实际的应用中,指向const对象的指针常用作函数的形参,以确保传递给函数的实际对象在函数中不因形参的改变而被修改。
2.const指针
const指针:是指该指针不可改变。
int errNumb = ;
int *const curErr = &errNumb;
可从右向左将上述定义读作“curErr是指向int型对象的const指针”。这意味着不能使curErr指向其他对象,任何试图给curErr赋值的操作均会导致编译错误。
curErr = curErr; //error
与任何const量一样,const指针必须在定义时初始化。
指针本身是const的事实并没有说明是否能使用该指针修改它所指对象的值。指针所指对象的值能否修改完全取决于该对象的类型。即该指针是const并不代表就不能修改其所指对象的值。如果const指针指向非const对象,那么就可以使用该指针修改所指对象的值:
int e=;
int *const p=&e;
*p=;
这样,e的值被修改为6。
3.指向const对象的const指针
还有一种指向const对象的const指针:
const double pi = 3.1415926;
const double *const pi_ptr = π
上例中,即不能修改pi_ptr所指对象的值,也不允许修改指针的指向(即pi_ptr中存放的地址值)。可从右向左将上述定义读作“pi_ptr首先是一个const指针,指向double类型的const对象”。
指针和Const限定符的更多相关文章
- Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符
在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义.样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的差值误差,这样就避免了使用高阶多项式 ...
- 【C】——指针与const限定符
const限定符和指针结合起来常见的情况有以下几种. const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所 ...
- C++之const限定符
作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...
- C++之const限定符(顶层const,底层const)
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...
- C++杂谈(一)const限定符与const指针
const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...
- C++ Primer 第二章 引用 指针 const限定符
1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...
- const 限定符
1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...
- 变量和基本类型——复合类型,const限定符,处理类型
一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...
- 浅谈const限定符
什么是const限定符? Const限定符是我们通常所说的常量限定符,被const修饰的对象具有常量性质,只能读,不能写. 为什么使用const限定符? 用const变量取代“魔数”,代码更容易理解和 ...
随机推荐
- poj1922
Ride to School Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18704 Accepted: 7552 D ...
- Linux学习笔记1:配置Linux网络和克隆虚拟机并更改配置
一.配置Linux网络 在安装Linux的时候,一定要保证你的物理网络的IP是手动设置的,要不然会在Linux设置IP连通网络的时候会报network is unreachable 并且怎么也找不到问 ...
- ruby中输入命令行编译sass(ruby小白)
Ruby(或cmd中)输入命令行编译sass步骤如下: (1)举例而言:首先在F盘下建立一个总文件夹,比如test文件夹:其次在该文件夹下建立html,images,js,sass等文件夹. (2)在 ...
- Datatable根据多行排序
DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Na ...
- RabbitMQ安装后启动出错:- unable to connect to epmd on blockstorage: timeout (timed out)
具体出错信息如下: [root@blockstorage ~]# rabbitmqctl change_password guest RABBIT_PASS Changing password for ...
- Hadoop Eclipse远程连接出现:Error:Call to /10.10.10.10:9000 failed on local exception: java.io.EOFException
异常截图:
- Oracle中针对中文进行排序[Z]
在oracle 9i之前,对中文的排序,是默认按2进制编码来进行排序的. 9i时增加了几种新的选择: 按中文拼音进行排序:SCHINESE_PINYIN_M 按中文部首进行排序:SCHINESE_RA ...
- OC中的代理模式
OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...
- C# 创建数组的几种方法
第一种 string[] myArray=new string[10]; 第二种 string[] myArray={"1","2"}; 第三种 string[ ...
- EC读书笔记系列之2:条款4 确定对象被使用前已先被初始化
条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次 ...