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

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

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

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

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

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

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

  看一下运行结果:

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

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

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

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

看一下测试结果:

  

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

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

看一下运行结果:

  

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

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

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

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

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

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

我们看一下测试结果:

  

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

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

测试结果:

  

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

总结:

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

C++中使用const修饰指针的更多相关文章

  1. C语言--const修饰指针解析

          这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了. 用const修饰指针,常见的情况可以分为四种: 1.const int *p; // p 可变,p 指向的对象不可 ...

  2. (原+转)C++中的const修饰符

    const int a; int const a; 这两个写法是等同的,表示a是一个int常量. 简记:const后面是什么就限定什么(因为C++标准规定,const关键字放在类型或变量名之前等价的) ...

  3. C++中的const和指针组合

    在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...

  4. const修饰指针

    关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...

  5. C++笔记019:C++中的const修饰的是一个真正的常量

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...

  6. const修饰指针+volatile +restrict

    const这块的难点 const修饰指针有以下的几种形式 ,不同的形式 它的意义不一样. 形式1: int a=23: const int *p=&a: a是int型,&a是int * ...

  7. c++中的const与指针

    const修饰符 使用const修饰变量时,该变量的值不可修改,因此需要初始化. 例如 const int s = 0: 此时s为值不可变的变量. 那么基于此,当const修饰指针时的情况有三种: ( ...

  8. 关于const修饰指针

    const修饰指针,一般分为如下四种情况: int b = 500; const int *a = &b;   //情况1 int const *a = &b //        2 ...

  9. C++ --const修饰指针

    const修饰指针 1.const修饰指针 (常量指针)常量的指针 const int *p = &a; const修饰的是*p(表示内容为常量),不是p(指针) 指针指向的地址可以改,但指针 ...

随机推荐

  1. 从零开始的JS生活(二)——BOM、DOM与JS中的事件

    上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...

  2. hdu5950

    hdu5950 题意 \(给出 f_1 , f_2 ,以及递推式 f_n = 2 * f_{n-2} + f_{n-1} + n^4 ,求 f_n (mod=2147493647)\) 推导一下. \ ...

  3. JavaSE教程-02Java基本语法-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看 1.注释 定义:用于解释说明程序作用的文字 注释类别 单行注释 格式: //注释文字 多行注释 格式: ...

  4. Java文件流之练习

    1 )将"今年是反法西斯胜利70周年,举国欢庆,所以要放假啦" 字符串 使用文件字符输出流 写入到oldhappy.txt文件中,复写10000行, 要求换行 在文件的开头写入当前 ...

  5. testlink(以及服务器)问题定位思路

    testlink又炸了,记录下问题定位思路: 1.翻阅logs: tail -100f ***.log 2.将关键字百度: 但是狗日的网上一般不会告诉我们这修改的文件在哪(上下图无关联,因为图是后面随 ...

  6. div,css命名规范!

    命名规则说明: 1).所有的命名最好都小写 2).属性的值一定要用双引号("")括起来,且一定要有值如class="pcss5",id="pcss5& ...

  7. [github项目]基于百度地图二次开发实现的车辆监管(包含车辆定位、车辆图片和方向控制,电子围栏,图形绘制等功能)前端实现(不包含后端实现)

    前言:基于百度地图javascript版本开发,百度地图中所用的key已承诺仅用于测试,不用于商业用途 注:本文所有代码可以到github上进行下载,github地址:http://map.eguid ...

  8. 如何判断img标签是否有src属性

    前几天,写一个小项目,需要判断img标签是否有src属性,想了半天,只能想到用jq实现,如下: if($(".img").attr("src")==undefi ...

  9. EF编辑

    //修改推荐的信息 var productRe = db.Shop_ProductRecommends.Single(item => item.Id == model.Id); productR ...

  10. 可选参数、命名参数、.NET的特殊类型、特性

    1.可选参数和命名参数    1.1可选参数        语法:            [修饰符] 返回类型 方法名(必选参数n,可选参数n)        注意:            1.必选参 ...