我们知道const是一个修饰符,加在变量前面;指针是一种变量(包含指针本身和指针所指的那个变量)
当指针指向一个值,指针本身可以是const,那个变量也可以是const
指针是const
表示一旦得到了某个变量的地址,不能再指向其他变量
eg. int * const q = &i; //q是const,指向了i的地址(不可改变)
*q = 26; //OK
q++; //ERROR
所指是const
表示不能通过这个指针去修改那个变量(并不能使的那个变量成为const)
eg. const int *p = &i;
*p = 26; //ERROR (*p)是const
i = 26; //OK
&j; //OK
意思是,p是一个指针,指向了i,i依然可以做运算,p也可以改变(因为p不是const),不能变的是:不能通过p去做赋值(eg. *p = 26;)。
p可以指向其他,i可以被赋予其他值,但不能通过p去修改i
什么意思?
int i;
①const int* p1 = &i;
②int const* p2 = &i;
③int *const p3 = &i;
判断哪个被const了的标志是const在*的前面还是后面
在*前:表示它所指的东西不能被修改①②
在*后:表示指针不能被修改③
转换
总是可以把一个非const的值转换成const的
void f(const int* x);
int a = 15;
f(&a); //OK
const int b = a;
f(&b); //OK
b = a + 1; //ERROR
应用:当要传递的参数的类型比地址大的时候,这是常用的手段。既能用比较少的字节数传递值给参数,又能避免函数对外面的变量的修改
const数组
const int a[] = {1,2,3,4,5,6};
数组变量已经是const的指针了,这里的const表明数组的每个单元都是const int,所以必须通过初始化进行赋值
保护数组值
因为把数组传入函数时传递的是地址,所以那个函数内部可以修改数组的值,为了保护数组不被破坏,可以设置参数为const
eg. int sum(const int a[], int length);