指针本身可以是const,指针所指向的变量也可以是const
区别和联系
指针是const
表示一旦得到了某个变量的地址,不能在指向其他变量
int *const q = &i; //q是const
*q = 26; //OK
q ++; //ERROR
如果p所指的int是const
表示不能通过指针变量去修改那个变量(并不是说能使那个变量成为const)
const int *p = &i;
*p = 26; //ERROR! (*p是const)
i = 26; //OK
p = &j;//OK
int i;
const int *p1=&i;//通过指针不可修改
int const *p2=&i;
int *const p3=&i; //指针不可修改
判断哪个被const的标志是看const的位置在*的前面还是后面,在后面说明指针不可被修改,在前面说明通过指针不可修改
转换
总是可以把一个非const的值转换成const的
void f(const int *x);//函数中定义了一个const的指针,在使用函数的过程中保证不会动外面变量的值
int a = 15;
f(&a);//OK
const int b = a;
f(&b);//OK
b = a + 1; //Error
当传递的参数的类型比地址还大,是常用的手段:既能用较少的字节数传递值给参数,又能避免函数对外面的变量的修改
const 数组
如const int a[]={1,1,2,4,4,5,}
数组变量已经是const的指针了,再加const表明数组的每个单元都是const int
所以必须通过初始化进行赋值
保护数组值
数组传入函数的是地址,因此函数可以对数组内部的值进行修改,为了保证数组内部的值不被破坏,可以设置参数为const
int sum(const int a[], int len);