const

目录

const限定符与const引用

(1)const对象一旦创建后其值不能改变,所以const对象必须初始化。

(2)利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要

(3)const 引用

const与指针

(1)const int p

(2) const int *p(指向常量的指针)

(3)int * const p(指向intl类型的常量指针)

(4)const double *const pip(指向常量的常量指针)


const限定符与const引用

(1)const对象一旦创建后其值不能改变,所以const对象必须初始化。

const int i=get_size();//正确,运行时初始化

const int j=42;//正确,编译时初始化

const int k;//错误,未初始化

(2)利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要

int i=42;

const int cp=i;//正确,i的值被拷贝给了cp(非常量拷贝给了常量)

int j=cp;//正确,cp的值被拷贝给了j(常量拷贝给了非常量)

(3)const 引用

对常量的引用不能用作修改它所绑定的对象

const int i=1024;

const int &r1=i;//正确,引用及其对应的对象都是常量

r1=42;//错误,r1是对常量的引用

int &r2=i;//错误,r2为非常量引用,不能指向一个常量对象

初始化常量引用允许用任意表达式作为初始值

int i=42;

const int &r1=i;//正确,允许将const int &绑定到一个普通int对象上

const int &r2=42;//正确

const int &r3=r1*2;//正确

const与指针

(1)const int p

使用const 修饰的i我们称之为符号常量,即i不能在其他地方重新赋值。const int i和int const i是等价的。

(2) const int *p(指向常量的指针)

从右向左看,先结合* 再结合const,定义一个指针指向一个常量,不能通过指针来修改这个指针指向的值。

看例子:
int p1 =30;
int p2=40;
const int *p=&p1;
p=&p2;  //此处,p可以在任何时候重新赋值一个新的内存地址。
p2=80;  //这里能用*p=80来代替吗?答案是不能
printf("%d",*p);  //输

出80
分析:p的值是可以被修改的,即它可以重新指向另一个地址。但是不能通过*p来修改i2的值。
首先,const修饰的是整个*p(注意,是*p而不是p),所以*p是常量,是不能被赋值的。虽然p所指的p2是变量而不是常量;
其次,p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。
指向常量的指针没有规定其所指向的对象必须是一个常量,所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其它途径改变。(也就是p指向的可以是非常量,只是不能通过*p来改变所指对象p2的值)


(3)int * const p(指向intl类型的常量指针)


先看const再看* ,p是一个常量类型的指针,不能修改这个指针的指向,但是这个指针所指向的地址上存储的值可以修改。

int p1=30;
int p2=40;
int * const p=&p1;
//p=&p2;  错误的。p不能再指向另一个新地址了。
p1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值。
printf("%d",*p);
分析:
此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。相反,可用*p修改p1的值了。

 

(4)const double *const pip(指向常量的常量指针)


从右向左看,先结合const,意味着pip本身是一个常量对象,声明符星号表示pip是一个常量指针,最后基本数据类型确定了常量指针指向的是一个const int 对象。无论pip所指向的对象值还是pip之间存储的地址值都不能改变。

所以:综上所述,指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。
整个*p前面没有const修饰,则*p为变量而不是常量,所以,可改变*p的值。
如果const修饰在*p前则不能改的是*p,而不是指p;
如果const是直接写在p前,则p不能改。


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值