C++中使用const修饰指针

 

在本文中呢,主要讲解四个方面,即:常量数据的与否和常量指针的与否中const如何对指针进行修饰:

1.指向非常量数据的常量指针

  对于一个指向非常量数据的常量指针,我们应该清楚的知道,在这我们注重的是指针常量,因此,指针始终指向一个内存地址,即该指针存储的地址数据不变,同时也可以通过此指针进行对应存储地址的数据修改,同时需要注意的是,时刻谨记声明为const的指针在声明时必须被初始化。废话不多说,直接上程序测试:

 1 //本程序测试指向非常量数据的常量指针
 2 //意在使得大家清楚 const 在修饰指针中的用法
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int    x = 1;
10     int y = 2; //x,y初始化赋值 
11     int * const ptr = &x; //初始化定义ptr指向x的地址
12     
13     *ptr = 7; //直接利用指针对对应地址的x进行数据的修改 
14     ptr = &y; //修改ptr的指向,看看是否会出错
15     
16     cout<<*ptr<<endl; 
17 } 

  依照上面解释的,这个程序肯定是会报错的,我们来看运行结果:

  我们可以很清湖的看到,对于一个指向非常量数据的常量指针,其指向的内存地址在初始化后是不可以修改的,我们将第14行注释掉,再看结果:

 1 //本程序测试指向非常量数据的常量指针
 2 //意在使得大家清楚 const 在修饰指针中的用法
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int    x = 1;
10     int y = 2; //x,y初始化赋值 
11     int * const ptr = &x; //初始化定义ptr指向x的地址
12     
13     *ptr = 7; //直接利用指针对对应地址的x进行数据的修改 
14     //ptr = &y; //修改ptr的指向,看看是否会出错
15     
16     cout<<*ptr<<endl; 
17 } 

  看一下运行结果:

      

  通过运行结果,我们可以很清楚的看到 ,通过该指针是可以修改对应地址上的数据的。

2.指向常数数据的常数指针

  我们看到小标题中用了两个常数来分别修饰数据和指针,根据常数的不变性,我们应该可以猜测到这一类的用法是具有最小的访问权限的,对于一个指向常量数据对的常量指针,和第一种用法中的特性类似,它首先指向一个固定的地址,其次,它不允许用这个指针修改这个内存位置的数据,接下来我们看一下程序测试:

 1 //本程序测试指向常量数据的常量指针
 2 //意在使得大家清楚 const 在修饰指针中的用法
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int    x = 1;
10     int y = 2; //x,y初始化赋值 
11     const int * const ptr = &x; //初始化定义ptr指向x的地址
12     
13     *ptr = 7; //直接利用指针对对应地址的x进行数据的修改 
14     ptr = &y; //修改ptr的指向,看看是否会出错
15 
16     cout<<*ptr<<endl; 
17 } 

看一下测试结果:

  

现在我们将第13,14行注释掉,看一下结果:

 1 //本程序测试指向常量数据的常量指针
 2 //意在使得大家清楚 const 在修饰指针中的用法
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int    x = 1;
10     int y = 2; //x,y初始化赋值 
11     const int * const ptr = &x; //初始化定义ptr指向x的地址
12     
13     //*ptr = 7; //直接利用指针对对应地址的x进行数据的修改 
14     //ptr = &y; //修改ptr的指向,看看是否会出错
15 
16     cout<<*ptr<<endl; 
17 } 

看一下运行结果:

  

  通过运行结果,我么可以很清楚的看到,对于一个指向常数数据的常量指针,是不运行修改指针初始化中指向的地址的,并且通过地址进行值的修改也是不允许的,但是,我们注意,是不允许利用该指针进行数据的直接修改,而对该数据的直接修改是允许的,这个很容易验证,读者可以自行进行。

3.指向非常量数据的非常量指针

  对于一个指向非常量数据的非常量指针,其直接定义如:int *ptr即可,不需要用到const进行修饰,他可以随时改变指针的指向,也可以随时利用指针进行数据的修改,在这就不进行程序的验证了

4.指向常量数据的非常量指针

  通过前面几个例子,其实我们可以大概猜测到对于一个指向常量数据的非常量指针的限制,即:此指针可以进行任意地址指向的修改,但是不运行利用此指针直接进行数据的修改,接下来我们用程序进行验证一下:

 1 //本程序测试指向常量数据的非常量指针
 2 //意在使得大家清楚 const 在修饰指针中的用法
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int    x = 1;
10     int y = 2; //x,y初始化赋值 
11     const int *ptr = &x; //初始化定义ptr指向x的地址
12     
13     *ptr = 7; //直接利用指针对对应地址的x进行数据的修改 
14     ptr = &y; //修改ptr的指向,看看是否会出错
15 
16     cout<<*ptr<<endl; 
17 } 

我们看一下测试结果:

  

  通过测试结果,我们可以很清楚的看到,在第13行中进行的利用指针直接赋值的方式是不被允许的,而第14行的修改指针指向是被允许的,接下来我们将第13行注释掉,来看一下运行结果:

 1 //本程序测试指向常量数据的非常量指针
 2 //意在使得大家清楚 const 在修饰指针中的用法
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int    x = 1;
10     int y = 2; //x,y初始化赋值 
11     const int *ptr = &x; //初始化定义ptr指向x的地址
12     
13     //*ptr = 7; //直接利用指针对对应地址的x进行数据的修改 
14     ptr = &y; //修改ptr的指向,看看是否会出错
15 
16     cout<<*ptr<<endl; 
17 }

测试结果:

  

  通过测试结果,我们可以很清楚的看到,在指向一个常量数据的非常量指针,其是可以进行指针指向的修改的。

 

总结:

  我们来对上述四个例子进行一下总结,其实我们很容易就会发现,常量这一个词修饰的量,会在该量最近的左方进行const的修饰,代表这个是一个常量,这样的修饰又分为两种,对于一个数据而言,如果利用const进行修饰,代表这个用法中不可以利用指针直接对其进行数据的修改对一个指针而言,如果其利用const修饰这一个指针,则说明对于这个指针而言,它指向的是一个固定的内存地址,不允许在初始化后对其进行再次的修改。

 

转载于:https://www.cnblogs.com/rzw8023/p/7216168.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值