const 和 pointer
一般的:
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的更多相关文章
- Duanxx的C++学习: const指针具体解释
Const指的是一个编译时的常量. keywordconst使得代码能够确定一个变量能否够被改动. 使用了const后,能够防止对变量或者指针的改动:更重要的是,const的引用能够防止对所引用的对象 ...
- C++Primer学习——const
Const int size = 512; 在编译的时候,编译器会把用到该变量的地方全部替换成对应的值. const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶 ...
- Meaning of “const” last in a C++ method declaration?
函数尾部的const是什么意思? 1 Answer by Jnick Bernnet A "const function", denoted with the keyword co ...
- const char and static const char
部分内容摘自:https://blog.csdn.net/ranhui_xia/article/details/32696669 The version with const char * will ...
- C++ Knowledge series STL & Const
Thank to the pepole who devote theirself to the common libs. STL(http://www.cplusplus.com/reference/ ...
- C++ std::set
std::set template < class T, // set::key_type/value_type class Compare = less<T>, // set::k ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- C++ std::map
std::map template < class Key, // map::key_type class T, // map::mapped_type class Compare = less ...
- C++ std::list
std::list template < class T, class Alloc = allocator > class list; List Lists are sequence co ...
随机推荐
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- Linux安装(虚拟机)
** 虚拟机安装CentOS系统 以下步骤会连续给出截图,大家自行校对即可. 首先打开虚拟机,出现的界面如上一篇文章截图所示. ** 配置虚拟机 步骤: 1.点击“创建新的虚拟机” 2.选择“ ...
- SpringCloud学习笔记(17)----Spring Cloud Netflix之服务网关Zuul的使用
1. 什么时候Zuul? Zuul是一个基于jvm路由和服务端的负载均衡器,在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. 路由功能:相当于nginx的反向代理 比如: / 可能需要映射到 ...
- 第三方库requests
requests库 # 1.记得安装 第三方 模块 requests # pip install requests import requests url = 'http://www.baidu.co ...
- Converting Legacy Chrome IPC To Mojo
Converting Legacy Chrome IPC To Mojo Looking for Mojo Documentation? Contents Overview Deciding What ...
- django框架-DRF工程之认证功能
1.在Rest framework中进行了一系列的封装,这个认证功能也是被封装到在DRF工程中的一种,想要使用,首先需要在配置文件中进行相应的配置 REST_FRAMEWORK = { ’DEFAUL ...
- BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...
- Java基础学习总结(3)——抽象类
一.抽象类介绍 下面通过一下的小程序深入理解抽象类 因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:pub ...
- ASP.NET-跨站伪造请求CSRF
经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击,在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可Html.Ant ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...