【C和指针】const指针
一,入门
const 指针
指针指向的内容不能变,指针可以改变指向
指向const的指针
指针不可以改变指向,指针指向内容可以变
#include "stdio.h"
int main()
{
//const 指针 (指针指向的内容不能变,指针可以改变指向)
int a = 5;
int b = 6;
const int *ptr = &a;
*ptr = 8; //error
ptr = &b; //ok;
//指向const的指针 (指针不可以改变指向,指针指向内容可以变)
int a = 5;
int b = 6;
int * const ptr = &a;
*ptr = 8; //ok
ptr = &b; //error
}
二,深度解析
大致说来其可分为三种情况: const修饰指针,const修饰引用,const修饰指针的引用.
const修饰指针
const修饰指针本身
const修饰指针所指的变量(或对象)
const修饰指针本身和指针所指的变量(或对象)
1)const修饰指针本身
这种情形下,指针本身为常量,p不可改变,任何修改指针本身的行为都是非法的.
例如:
const int a = 1;
const int b = 2;
int i = 3;
int j = 4;
int* const pi = &i; //ok, pi的类型为int* const , &i的类型为int* const
int* const pi = &a; //error, pi的类型为int* const, &a的类型为const int* const
pi = &j; //error, 指针是常量,不可变
*pi = a; //ok, *pi并没有限定是常量 ,可变
由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。
2)const修饰指针指向的变量(或对象)
此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明:
const int *pi = &a; //也可以写成 int const *pi = &a;
const int *pi = &i; //ok ,pi可赋值常量的地址,又可赋变量的地址
const int *pi1 = &a;
const int *pi = pi1; //ok
*pi = j; //error,*pi 不可变,不能更改指针的间接引用形式
pi = &j; //ok,pi可变
pi = &b; //ok,pi可变
pi++; //ok
--pi; //ok
3)const修饰指针本身和指针所指的变量(或对象)
设有指针p,此种情形下,p和*p都不可变.举例如下:
const int* const pi = &a; //or int const* const pi = &a;
//将const pi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*, &a的类型为const int* const,含有int*, 所以可以赋值。
const int* const pi = &i; //ok, &i类型为int* const,含有int*, 可赋值。
const int *pi1 = &j;
const int *const pi = pi1; //ok, pi1类型为int*
pi = &b; //error, pi不可变
pi = &j; //error, pi不可变
*pi = b; //error, *pi不可变
*pi = j; //error, *pi不可变
pi++; //error ,pi不可变
++i; //ok, =号右边的变量(或对象)与所修饰的变量无关
a--; //error, a为const
这种情况,跟以上两种情形有联系。对const int* const pi = &a;我们可以这样看:const int*( const pi )= &a;(仅仅是表达需要),将const pi看作一体,就与上述分类(2)符合。只要含有int*便可.
const修饰引用
这种情况比较简单,没有象修饰指针那样繁复,因为引用和引用对象是一体的,所以引用被const修饰只有一种类型。
const修饰引用,引用本身不可变,但引用的变量(或对象)可以改变.例如:
const int& ri = a; //or int const & ri = a; ok, ri 本身是常量,引用不区分类型
const int& ri = i; //ok,引用不区分类型
ri++; //error, ri为常量,不可变
i++; //ok,=右边的变量与引用无关
ri=b; //error, ri为常量
i=j; //ok,=右边的变量与引用无关
int & const ri = i; //error,不存在这种形式,没有意义
const修饰指针的引用
引用只是个别名,这里与修饰指针类似,又分为三种情况:
(1)
先给个例子:
const int *pi = &a;
const int *&ri = pi; //or int const *&ri = pi;
引用是引用对象的别名,正因为如此,ri是pi的别名,所以ri的类型必须与pi完全一致才行。这里pi的类型为int*,ri的类型也为int*,赋值可行。若const int *&ri = &a;正不正确?分析一下就知晓。ri类型为int*,&a的类型则为const int* const不匹配。
const int *&ri = &i; //error,类型不匹配,一为int*,一为int* const
ri = &a; //ok
ri = &i; //ok
const int *pi1=&a;
const int *pi2=&i;
ri = pi1; //ok
ri = pi2; //ok
*ri = i; //error
*ri = a; //error
注意这与1-(2)的区别.
(2)
用例子说明:
int *const &ri = &i; //去掉ri左边的&号,则为int *const ri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int *const,&i为int *const,可以这么做.
int *const &ri = pi; //error,类型不合,一为int *const ,一为int *
int *const &ri = &a; //error,类型不合,一为int *const,一为const int* const
(*ri)++; //ok
i++; //ok
ri = &i; //error
这种情况下,ri为常量,不可更改.
(3)
用例子说明:
const int* pi = &j;
const int* const &ri = pi; //or int const * const &ri = pi;ok
const int* const &ri = &i; //ok
ri是pi的别名,pi的类型应与ri一致。拿掉&,得const int* const ri ,把const ri看作一体,很容易得出ri的类型信息,就象前面2-(3)所讨论的一样,可以得到赋给ri的只要含有类型int* 即可。pi的类型为int*,&i的类型为int* const ,可以这么做.
const int * const &ri = &a; //ok
ri++; //error
*ri = 6; //error
【C和指针】const指针相关推荐
- C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针
const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...
- C++ Const指针学习
Const指针 const指针顾名思义就是常量指针的意思.下面将通过一些具体例子说明const指针的几种用法. const type *p 特性 防止使用p指针来修改p所指向的值,下面是最简单的错误例 ...
- C++之指向const对象的指针和const指针
1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...
- 修改const指针所指向的值
dval = 3.14159; *cptr = 3.14159; //错误 cptr是一个指向const的指针 double *ptr = &dval; //正确 ptr指向非co ...
- C++指向const对象的指针和const指针
1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...
- const指针与指向const的指针
const指针与指向const的指针 const指针 如下代码: int main() {int num = 42;int* const p = # // p是常量指针,指向一个整型数cout < ...
- 指向const的指针和const指针
如何区分 1.const的右边是指针类型,则指针是const,即const指针:const的右边是整型类型,则该类型是const,即指向const的指针: 2.指向const的指针可以不用初始化,因为 ...
- inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载
嵌入式Linux:C++ 面试准备珍藏版本zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理 ...
- 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
文章目录 一.const 普通用法 二.常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 ) 三.指针常量 ( 指针不能被修改 ) 三.指向 常量 的 指针常量 四.const 在 * 左 ...
- c++中的void指针和const指针
在c++中可以声明指向void类型的指针,指向void类型的指针称为void指针,此外,在声明指针时,还可以用关键字const进行修饰,用关键字const修饰的指针称为const指针. 1.void指 ...
最新文章
- 2018-3-7论文网络评论中非结构化信息的表示与研究--------实验分析
- R构建指数回归模型(Exponential Regression)
- 深入Activity的作业完成
- 配置tomcat支持http delete和put的方法
- jQuery中this与$(this)的区别总结
- LeetCode 581. 最短无序连续子数组(排序单调栈)
- python未将对象引用设置到对象的实例_在Python中使用pingarapi。服务器引发Webfault:对象引用未设置为对象的实例...
- vue assets图片_Vue实战—如何细化Vue项目目录设计(2)
- 解决浏览器兼容性问题
- DEFERRED_SEGMENT_CREATION
- XML与HTML区别
- 孙鑫VC学习笔记:第十二讲 (六) 读写注册表
- 前端开源项目周报1213
- Validation 参数校验
- git 记住账号密码、忽略部分文件、合并分支、将远程分支拉取到本地
- GBase 8c数据库登陆
- 使用pyqt5的日期控件做一个小日历方便查看
- U盘安装Linux系统教程
- TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
- 专访仙工智能叶杨笙:工业产品如何提升研发效能?