首页 > 编程 > C++ > 正文

C++教程:C++指针与保护

2020-05-23 14:27:14
字体:
来源:转载
供稿:网友
在第二节,我们说到了,如果没有对指针进行初始化就改变它所指向的内存里的数据是非常危险的。因为不确定的指针有可能指向了一个系统需要的关键数据,数据一旦被更改或破坏系统就会崩溃。在我们使用电脑磁盘的时候,都知道有一种措施叫做“写保护”。(或者称为“只读”,即只可以读,不可以写)那么,我们能否给指针加上写保护呢?

对内存只读的指针

为了解决指针可能误修改或破坏内存中的数据,我们可以对内存中的数据加上写保护。即具有这种属性的指针只能够读出内存中的数据,却不能修改内存中的数据。我们把具有这种属性的指针称为指向常量的指针,简称常量指针。

给内存中的数据加写保护的方法是在声明指针时,在指针类型(即各种数据类型)前加上const,表示这些数据是常量,只能读不能写。比如:const int *iptr;,这时候我们只能够通过指针iptr读出内存里的数据,但是不能对其写入、修改。

当然,这样的保护措施只是防止通过间接引用iptr修改内存中的数据,并不保护iptr本身和iptr所指向的变量。

指针型常量

我们说,指针同整型,字符型一样,是一种数据类型。整型可以有整型常量和整型变量;字符型可以有字符型常量和字符型变量。那么,指针也应该有指针常量。指针常量和常量指针不同,指针常量是指正所指向的位置不能改变,即指针本身是一个常量。但是指针常量可以通过间接引用修改内存中的数据。定义指针常量的语句格式为:
    指针类型 * const 指针常量名=&变量名;

下面我们来看一段程序,实践一下指针常量和常量指针:(程序8.4)
#include "iostream.h"
int main()
{
   int a=42;
   const int b=84;
   const int *captr=&a;//常量指针
   int * const acptr=&a;//指针常量
   int *bptr=&b;//错误,不能把常量的地址给指针变量
   const int *cbprt=&b;//把常量的地址给常量指针是允许的
   *captr=68;//错误,间接引用常量指针不可修改内存中的数据
   *acptr=68;//间接引用指针常量可以修改内存中的数据
   captr=&b;//常量指针可以指向其他变量
   acptr=&b;//错误,指针常量不能指向别的变量
   const int * const ccaptr=&a;//常量指针常量,既不能间接引用修改数据,也不能指向别的变量或常量
   *ccaptr=68;//错误,不能间接引用修改数据
   ccaptr=&b;//错误,不能指向别的常量或变量
   return 0;
}
以上程序存在错误,无法通过编译。我们考虑到使用指针的安全性的时候,就能想到要使用以上这些保护措施保护内存中的数据。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表