指针与Const

指针可以是const,指针所指的变量也可以是const

指针是const

表示一旦得到某个变量的地址,不能再指向其他变量

  1. int *const p=&i;//q是const
  2. *q=26;//ok
  3. q++;//ERROR

所指是const

表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)

  1. const int *p=&i;
  2. *p=26;//ERROR!(*p)是const
  3. i=26;//ok
  4. p=&j;//ok
  1. int i;
  2. const int* p1=&i;
  3. int const* p2=&i;
  4. //上面两个是不能通过指针去修改变量
  5. int *const p3=&i;
  6. //这个是指针不能被修改

判断哪个被const了的标志是const在*的前面还是后面

转换

总是可以把一个非const的值转换成const的

  1. void f(const int* x);
  2. int a=5;
  3. f(&a);//ok
  4. const int b=a;
  5. f(&b);//ok
  6. b=a+1;//Error

当要传递的参数的类型比地址大的时候,这是常用的手段:既能用比较少的字节数传递值给参数,又能避免函数对外面变量的修改。

const数组

  1. const int a[]={1,2,3,4,5,6};

数组变量已经是const的指针了,这里的const表明数组的每个单元都是const int

所以必须通过初始化赋值

保护数组值

因为把数组传入函数时传递的是地址,所以函数可以在内部修改数组的值

为了保护数组不被函数破坏,可以设置参数为const

  1. int sum(const int a[],int length);