学习C语言至今,const这个关键字想必大家没少见吧,有时候对它还挺迷的,今天我们就来看一下const的基本语法。
在说const之前我们先来看一下左值和右值
左值:在赋值号左边的变量,可以进行写操作(权限)。
右值:在赋值号右边的变量,只能进行读操作(权限)。
eg.1:
int a=10;
int b=a;//表示把a的值读出来,给b进行写操作
a=20;//给a写值
现在我们来说一下const:
const用来限定变量权限,把变量变为只读不能写的变量。
eg.2:
const int ca=10;
ca=20;//error,因为ca为只读,不能写
const int cb;//error因为没有定义的变量为任意值,所以不能前面加const
const的相关规则:
- 基本数据类型(int,char,float等)对于const是透明的,可以直接穿过,要记住const是限定变量而不是类型。
eg.3:
const int ca=10;
int const ca=10;
这两条代码的意思是一样的。
- 对于指针,const只能限定修饰的直接右边,即右边离const最近的变量
eg.4:下面代码我们不讲究语法错误,意在说明const的用法
const int *p=&a;//const穿过int,修饰直接右边*p,所以*p不可以进行写操作,即不能在等号左边,但p可以进行写操作
p=&a;//?
*p=100;//error
int const *p2=&a;//const可以直接穿过int
int *const p3=&a;//const的直接右边为p3,所以p3不能写操作,但*p可以
p3=&b;//error
*p3=100;//?
const int *const p4=&a;//两个const,第一个限制了*,第二个限制了p4,所以p4和*p4都不可以进行写操作。
p4=&b;//error
*p4=100;//error
- 权力可以同等传递或缩小传递,但不能放大传递。(通俗来讲,就是一个人从图书馆借了一本书,他只有读的操作,他不能写,他把这本书让别人看,别人也不能写,只能读,他也可以不让别人看,这就是权力的同等传递和缩写传递,但他不能让别人写,这便是不能放大传递。)
eg.5:下面代码我们不讲究语法错误,意在说明const的用法
int main()
{
int a=10;
const int ca=10;
int *p1=&a;//?因为a没有限制
int *p2=&ca;//error因为ca是不能改的,而p2只是一个普通的变量,若它指向了ca,便可以通过解引用来改变ca的值,非法。
const int *p3=&a;//?因为a没有限制
const int *p4=&ca;//?因为两个都是不能修改的,所以就算p4解引用了ca,但是它不会去改,因为*p4被限制了,可以
int *const p5=&a;//?因为a没有限制
int *const p6=&ca; //error因为const限制的是p6,它保证了永远指向ca,但*p6可以变,会改变ca的值,所以错误。
大家一定要牢记这几条规则,把const使用无误。