指针和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;

  上例中,即不能修改pi_ptr所指对象的值,也不允许修改指针的指向(即pi_ptr中存放的地址值)。可从右向左将上述定义读作“pi_ptr首先是一个const指针,指向double类型的const对象”。

指针和Const限定符的更多相关文章

  1. Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符

    在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义.样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的差值误差,这样就避免了使用高阶多项式 ...

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

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

  3. C++之const限定符

    作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...

  4. C++之const限定符(顶层const,底层const)

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...

  5. C++杂谈(一)const限定符与const指针

    const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...

  6. C++ Primer 第二章 引用 指针 const限定符

    1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...

  7. const 限定符

    1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...

  8. 变量和基本类型——复合类型,const限定符,处理类型

    一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...

  9. 浅谈const限定符

    什么是const限定符? Const限定符是我们通常所说的常量限定符,被const修饰的对象具有常量性质,只能读,不能写. 为什么使用const限定符? 用const变量取代“魔数”,代码更容易理解和 ...

随机推荐

  1. poj1922

    Ride to School Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18704   Accepted: 7552 D ...

  2. Linux学习笔记1:配置Linux网络和克隆虚拟机并更改配置

    一.配置Linux网络 在安装Linux的时候,一定要保证你的物理网络的IP是手动设置的,要不然会在Linux设置IP连通网络的时候会报network is unreachable 并且怎么也找不到问 ...

  3. ruby中输入命令行编译sass(ruby小白)

    Ruby(或cmd中)输入命令行编译sass步骤如下: (1)举例而言:首先在F盘下建立一个总文件夹,比如test文件夹:其次在该文件夹下建立html,images,js,sass等文件夹. (2)在 ...

  4. Datatable根据多行排序

    DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Na ...

  5. RabbitMQ安装后启动出错:- unable to connect to epmd on blockstorage: timeout (timed out)

    具体出错信息如下: [root@blockstorage ~]# rabbitmqctl change_password guest RABBIT_PASS Changing password for ...

  6. Hadoop Eclipse远程连接出现:Error:Call to /10.10.10.10:9000 failed on local exception: java.io.EOFException

    异常截图:

  7. Oracle中针对中文进行排序[Z]

    在oracle 9i之前,对中文的排序,是默认按2进制编码来进行排序的. 9i时增加了几种新的选择: 按中文拼音进行排序:SCHINESE_PINYIN_M 按中文部首进行排序:SCHINESE_RA ...

  8. OC中的代理模式

    OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...

  9. C# 创建数组的几种方法

    第一种 string[] myArray=new string[10]; 第二种 string[] myArray={"1","2"}; 第三种 string[ ...

  10. EC读书笔记系列之2:条款4 确定对象被使用前已先被初始化

    条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次 ...