const是constant的简写,是不变的意思。

修饰普通变量


修饰数组

例如使用const关键字修饰数组,使其元素不允许被改变:

  1. const int arr[] = {0,0,2,3,4}; //与int const arr[]等价
  2. arr[2] = 1; //编译错误
  3. 试图修改arr的内容的操作是非法的,编译器将会报错:
  4. error: assignment of read-only location arr[2]’

修饰指针

修饰指针的情况比较多,主要有以下几种情况:

1.const 修饰 *p,指向的对象只读,指针的指向可变:

  1. int a = 9;
  2. int b = 10;
  3. const int *p = &a;//p是一个指向int类型的const值,与int const *p等价
  4. *p = 11; //编译错误,指向的对象是只读的,不可通过p进行改变
  5. p = &b; //合法,改变了p的指向

这里为了便于理解,可认为const修饰的是p,通常使用对指针进行解引用来访问对象,因而,该对象是只读的。

2.const修饰p,指向的对象可变,指针的指向不可变:

  1. int a = 9;
  2. int b = 10;
  3. int * const p = &a;//p是一个const指针
  4. *p = 11; //合法,
  5. p = &b; //编译错误,p是一个const指针,只读,不可变

3、指针不可改变指向,指向的内容也不可变

  1. int a = 9;
  2. int b = 10;
  3. const int * const p = &a;//p既是一个const指针,同时也指向了int类型的const值
  4. *p = 11; //编译错误,指向的对象是只读的,不可通过p进行改变
  5. p = &b; //编译错误,p是一个const指针,只读,不可变

总结

const放在*的左侧任意位置,限定了该指针指向的对象是只读的;
const放在*的右侧,限定了指针本身是只读的,即不可变的。
**
如果还不是很好理解,我们可以这样来看,去掉类型说明符,查看const修饰的内容,上面三种情况去掉类型说明符int之后,如下:

  1. const *p; //修饰*p,指针指向的对象不可变
  2. * const p; //修饰p,指针不可变
  3. const * const p; //第一个修饰了*p,第二个修饰了p,两者都不可变

const右边修饰谁,就说明谁是不可变的。上面的说法仅仅是帮助理解和记忆。借助上面这种理解,就会发现以下几种等价情况:

  1. const int NUM = 10; //与int const NUM等价
  2. int a = 9;
  3. const int *p = &a;//与int const *p等价
  4. const int arr[] = {0,0,2,3,4}; //与int const arr[]等价