const和指针

之前一直搞不清楚const,现在复习之后搞懂了一点,记录如下:
一.首先我们知道const是用来声明常量的(重要)
const int a=5;//那么a现在就是5这个常数了
这个很好理解。
对于指针,同样的。我们知道指针就是位置,一个有特殊作用的整数变量。那么:
int age=21;
const int *pt=&age;
————————————————————
二.现在pt的值就变不了了,它一直指向age的地址(自编词汇:地址常量)。同时,*pt的值也改不了。比如:
*pt+=1;//非法,无法通过
到这里,可以发现已经把自己搞晕了,分隔符下到此都写错了。为什么?
int age=21;
const int *pt=&age;
const int *pt的意识是pt指向一个const int,即pt地址上是个int常量,而不是说pt是个const的地址(关键点:const作用于谁)。
————————————————————
三.现在重来,我执行代码
*pt=5;
编译器认为,我pt指向一个int类型的常数,是不能改变值的,现在你想变成5,没门!报错
但我直接改age=5;却可以,因为age类型只是普通的int。
那我改一下程序
int age=21;
int * const pt=&age;//注意int const* pt和const int *pt一样
现在我再执行*pt=5;就可以编译通过了
————————————————————
四.现在有一个结论,带const类型的变量不能赋值给不带const类型的,因为只有带const类型的变量才能赋值给带const类型的值,例子:
const int a=21;
const int b = a;//可以
int c=a;//报错
因为,如果上一行代码如果可以,那么我改变c就可以改变a了。a定义为const是不能改变的啊!所以不行。那么为什么三里改age=5却可以,这里解释为:在age的地址变量赋值给pt时,对age没有影响,它本来就是个普通的int类型变量啊!只是pt以为它指向的是个const int。怪pt自己搞错了,那你pt的值就别想改变了。
————————————————————五.指针的指针的const
理解前面的话,这里就好理解了
const int **pp2;//pp2是(const int)的指针的指针,所以**pp2=5;会报错
int **p2;
p2=pp2;//报错,因为违反四
pp2=p2//也报错,原因:
虽然不违反四,但是进入两级间接关系是,也是不可以的,假设可以。
int const n=13;
*pp2=&n;//两边都是const int *
**p2=5;//那么现在n也变成5了,n是常数啊不能变,所以错(const指向的东西一定变不了,尤其是先一步定义为常量的,三那里是age先一步是普通int,pt是const但指晚了)
————————————————————
六.为什么函数那个括号里面的形参加const
例如:void fun(const int array[],int n)
它带个const,那么这个函数里面无法改变array数组里的值,否则会报错,这可以防止不小心操作下,改变数组值(很容易犯错啦)
函数形参加const的两大好处:
1、防止不小心修改值
2、可以向里面传递带const的值(形参不带就传递不了const类型的实参啊)


reference
C++ Ptimer Plus中文版:第六版/(美)史蒂芬·普拉达著;张海龙,袁国忠译.--北京:人民邮电出版社,2020.7
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值