一般的:

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. Django(1.7 part1)

    django安装: django解压后目录下有一个setup.py文件,在命令行运行python setup.py install,当前前提是已经安装了python才能执行命令,然后用下面命令检查dj ...

  2. DF标志和串传送指令

    DF标志和串传送指令 flag的第10位是DF,方向标志位.在串处理指令中,控制si.di的递减. df = 0 每次操作后si.di递增 df = 1 每次操作后si.di递减 串传送指令 格式1: ...

  3. JavaScript在不同环境下的全局对象

    Node.js 环境下,全局的对象是 global. 浏览器下 window === self 而不是 global,今天才发现的,我惊呆了!

  4. 关于注意力机制(《Attention is all you need》)

    深度学习做NLP的方法,基本上都是先将句子分词,然后每个词转化为对应的词向量序列.(https://kexue.fm/archives/4765) 第一个思路是RNN层,递归进行,但是RNN无法很好地 ...

  5. const char *初值赋值以及文件读取

    #include<iostream> #include<fstream> #include<string> #include<cstring> usin ...

  6. 路飞学城Python-Day15

    模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...

  7. java 通过cookie判断是否登陆

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOEx ...

  8. [ZJOI2007]捉迷藏 (点分树+堆*3)

    点分树一点都不会啊(还是太菜了) 点分树就是我们点分治构成的新树.满足深度很小. 然后我们就可以在上面瞎维护东西了. 三个大根堆: \(C[u]\)里装的是点分树中u的子树所有点到点分树中u的父亲的距 ...

  9. 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

    MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...

  10. JavaScript(14)jQuery(JavaScript 库)

    JavaScript 框架(库) JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常非常困难也非常耗时.为了应对这些调整,很多的 JavaScript (helper) 库应运而 ...