一般的:

const对pointer的修饰有两种:

  • const type * p/type const * p:表示指针指向的变量的值不能改变,无论指针改变为指向哪一个变量
  • type * const p:表示指针的值不能改变,不能指向其它变量

值得注意的是数组,如果一个const指针指向数组,那么这个数组都是不能通过这个指针改变的。因为无论这个指针指向哪个内存地址,它都是一个const指针,它指向的变量值都不能被改变

接下来讨论第一种类型的的一些问题。为方便,以下将称之为const指针

  • const指针将可以指向非const量,这样通过指针得到的还是const的效果
  • 用非const指针指向const变量是不可以的,有的编译器会识别为error,有的会识别为warring
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
  • 将一个const指针的值赋给一个非const指针是不可以的,将会使编译器产生一个warring或error

但是实际上编译器检查的是:

  • 是否直接通过const指针修改值
  • 是否将const指针直接赋给非const指针

如果不是通过直接赋值的方式获取到了const指针的值,并将其赋给非const指针,那么再进行变量修改将不会产生任何问题

  • 方法一:获取一个const指针存储的地址值并将其当作数值存储,比如存在一个long类型的变量中,再将这个变量通过类型转换赋值给另一个非const指针,编译器就无法识别这个过程中的危险之处。
  • 方法二:连续声明一个const变量和一个非const变量,那么可以通过一个变量推测到另一个变量的地址。此时就可以通过指向非const变量的指针指向const变量,编译器同样无法检测

多重指针:

声明为指向值不能改变的多重指针只会在改变其最终指向的值时报error,改变中间过程指向的地方不会产生error或warring

不能把一个非const类型的指针通过取地址赋值给一个比它高一重的const指针,因为这样可以通过这个非const指针改变最终指向的值,但是如果通过取const指针的中间地址并改变它为非const指针的值就不会产生error或warring

const 和 pointer的更多相关文章

  1. Duanxx的C++学习: const指针具体解释

    Const指的是一个编译时的常量. keywordconst使得代码能够确定一个变量能否够被改动. 使用了const后,能够防止对变量或者指针的改动:更重要的是,const的引用能够防止对所引用的对象 ...

  2. C++Primer学习——const

    Const int size = 512; 在编译的时候,编译器会把用到该变量的地方全部替换成对应的值. const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶 ...

  3. Meaning of “const” last in a C++ method declaration?

    函数尾部的const是什么意思? 1 Answer by Jnick Bernnet A "const function", denoted with the keyword co ...

  4. const char and static const char

    部分内容摘自:https://blog.csdn.net/ranhui_xia/article/details/32696669 The version with const char * will ...

  5. C++ Knowledge series STL & Const

    Thank to the pepole who devote theirself to the common libs. STL(http://www.cplusplus.com/reference/ ...

  6. C++ std::set

    std::set template < class T, // set::key_type/value_type class Compare = less<T>, // set::k ...

  7. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  8. C++ std::map

    std::map template < class Key, // map::key_type class T, // map::mapped_type class Compare = less ...

  9. C++ std::list

    std::list template < class T, class Alloc = allocator > class list; List Lists are sequence co ...

随机推荐

  1. Ajax :六个全局事件

    加载请求: .ajaxStart() 和 .ajaxstop() $(document).ajaxStart(function(){ $('.loading').show(); }).ajaxStop ...

  2. 【原创】Google的文本内容对比代码

    /* * Diff Match and Patch * * Copyright 2006 Google Inc. * http://code.google.com/p/google-diff-matc ...

  3. 中级前端工程师要掌握的JavaScript 技巧

    1.判断对象的数据类型 2.Es5实现数组map方法 3.使用reduce实现数组map方法 4.ES5 实现数组filter方法 5.使用reduce实现filter方法 6.ES5 实现数组som ...

  4. Hibernate中如何完成持久化类和数据库映射文件

    因为最近写项目需要要到,就在这里码码字,方便以后做一个参考,在这里,我通过的是myeclipse的反向工程来配置持久化类和数据的映射文件的. 1.打开myeclipse,打开数据库视图,对应的是Win ...

  5. __weak修饰符

    前言 在 HAL 库中,很多回调函数前面使用__weak 修饰符. weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”. 加上了__weak ...

  6. HDU 3046 Pleasant sheep and big big wolf

    Pleasant sheep and big big wolf Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged ...

  7. Qt之OpenSSL

    简述 OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 简述 下载安装 使用 更多参考 下载安装 ...

  8. [TypeScript] Asynchronous Iteration using for-await-of

    The for-await-of syntax is similar to the for-of iteration. The key difference is that it automatica ...

  9. OpenCASCADE点向平面投影

    OpenCASCADE点向平面投影 OpenCASCADE的ProjLib类提供了解析曲线(直线.圆.椭圆.抛物线.双曲线)向解析曲面(平面.圆柱面.圆锥面.球面.圆环面)投影的功能,主要用来计算三维 ...

  10. 【金阳光測试】基于控件核心技术探讨---Android自己主动化系列(2)---2013年5月

    第一讲分享了下安卓自己主动化一些概况和一些自己主动化框架现状和技术可以解决什么样的问题. 这次课就深入到android世界里面.遨游.翱翔.深入了解自己主动化測试核心技术. 搞过编程开发的同学听到in ...