const与指针用法
const
const int z =y.之后z不能再赋值了。
person p1("abc",200);
const person* p =&p1; //对象是const
person *const p =&p1;//指针是const
// const 在*之前是对象是const。 const 在*之后是指针是const。
这里介绍
有两种不同的方式将const关键字用于指针:
第一种是指针指向一个常量对象,防止使用该指针修改所指向的值;
第二种是将指针本身声明为常量,防止改变指针指向的位置。
1. 指向一个常量的指针
例如,声明一个指向常量的指针pt:
int age=23;
const int*pt=&age;
该声明指出,pt指向一个const int(这里为23),因此不能使用pt来修改这个值,即*pt的值为const,不能被修改:
*pt+=1; //不可行
但是pt的声明并不意味着它指向的值是一个常量,而只是意味着对pt而言这个值是常量,例如:pt指向age,而age不是const,可以直接通过age变量来修改age的值,但不能使用const指针来修改它:
*pt=20; //不可行
age=20; //可行
2. 将const变量的地址赋给指向const的指针是可行的,但将const的地址赋给常规指针是不可行的:
const int age=23;
const int*pt=&age; //可行
const int age=23;
int*pt=&age; //不可行
第一种情况禁止使用age来修改值23,也不能使用pt来修改;
第二种情况不可行的原因是将常量age的地址赋值给pt。则可以使用pt来修改age的值,这就使得age的const状态很荒谬,因此C++禁止将const的地址赋给非const指针,如果非要这么做,只能使用强制转换来突破这种限制。
指针
3.指针指向指针
当涉及为一级间接关系,则将非const指针赋给const指针是可以的:
int age=23; //age++is a valid operation
int*pd=&age; //*pd=24 is a valid operation
const int*pt=pd; //*pt=25 is a invalid operation
注意:如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针。
4.将指针声明为const常量
int sloth=3;
const int*pt=&sloth; //a pointer to const int指向const int的指针
int *const finger=&sloth; //a const pointer to int指向int的const指针
第二种声明格式只能使finger指向sloth,不能修改指针指向的地址,但允许使用finger来修改sloth的值,第一种声明格式不允许使用pt来修改sloth的值,但允许修改pt指向的地址,简而言之,finger和**pt是const,而*finger和pt不是。
补充:
指针本身是一个对象,它又可以指向另外一个对象,故指针本身是不是常量以及指针所指的对象是不是一个常量是两个相互独立的问题,可以用名词顶层const(top-level const)表示指针本身是一个常量,名词底层const(low-level const) 表示指针所指对象时一个常量;
int i=0;
int *const p1=&i; //不能改变p1的值,顶层const
const int ci=42; //不能改变ci的值,顶层const
const int *p2=&ci; //允许改变p2的值,底层const
const int *const p3=p2;//靠右的const是顶层const,靠左的是底层const
const int &r=ci; //用于声明引用的const都是底层const
const与指针用法相关推荐
- const修饰指针和引用的用法【转贴】
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- C++指针与const的结合用法
C++之const用法总结 指针与const的结合用法 指针与const的结合用法 基本概念:指针有两个值,一个是其自身的值(即所指变量的地址),一个是它所指向的值(这是理解其它用法的基础),所谓指针 ...
- const指针用法总结
1.const限定符 const限定符可以把一个对象转换成一个常变量,常量在定义后就不能被修改,因此定义时必修初始化. const int bufSize = 512;//OK bufSize = 0 ...
- c语言常量的正确表示const,C语言中的const和free用法详解
注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...
- const int *p说明不能修改_C语言关键字const和指针结合的使用
C语言中,const 的作用是把变量变为一个只读的变量.与指针结合起来,有以下几种用法,下面分别进行说明. const int p; const int *p; int * const p; cons ...
- c语言指针用法有哪些
c语言指针用法: 一,指针定义: 指针变量的取值范围取值0~4G,是一种数据类型(无符号整数,代表了内存编号).它可以用来定义变量(与int.long一样),与int.long不同的它存储整数代表了内 ...
- C++ const 引用 指针答疑
常变量 const int a 常引用 const int &a 常指针 const int *a const * int a 用法1:常量 取代了C中的宏定义,声明时必须进行初始化( ...
- C/C++中const关键字的用法及其与宏常量的比较
1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 1 const int a = 10; 2 int const b = 2 ...
- [转] C++中 const, volatile, mutable用法
const.volatile.mutable的用法 const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写 ...
最新文章
- HDU 3665 Seaside(Dijkstra)
- spring+springmvc+ibatis整合小结
- PAT1066 Root of AVL Tree (25)(AVL树)
- 五邑大学数据结构邢润丹实验_哪个大学楼最高:全国大学高楼海拔高度排名
- android componentname activity,ComponentName的使用
- c#解压,压缩文件!!!
- 实践卡尔曼滤波--小球追踪
- java基础之设计模式
- quick time不可用_那些校园中“不可言说”的鄙视链
- 从skyeye学习arm( u-boot篇)
- BZOJ 2456: mode
- jQuery Mobile中按钮<a>或<button>添加class样式ui-btn-*
- heightForRow
- 深入理解计算机系统总结
- oracle查询锁表进程
- Spark SQL 内置函数(六)Window Functions(基于 Spark 3.2.0)
- Centos7安装Docker并配置镜像加速器
- 5.3.3—二叉查找树—Validate Binary Sear Tree
- 第三届江西省高校网络安全技能大赛 部分wpCrypto的疑惑
- Entering emergency mode. Exit the shell to continue.。。。
热门文章
- hash和btree索引的区别
- PPT写得好的人,为什么都如此遭人痛恨?
- https信任证书的三种方式
- 美国西储大学轴承数据
- 【校招VIP】产品经理行测之数列题
- Python读取指定文件夹中的所有图片并保存
- 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3
- 模式分解(2NF、3NF)
- c语言中空格与nul,NUL字符在命令行中的重用
- 作为管理人员如何处理下属工作的偏差