const修饰的对象,其值在编译期间是不会被改变的;
const int a = 3;
//a = 5; // 报错!a的值不允许被修改
当const和*放在一起时,此时可以在心里从右往左默读,这样就可以,辨别出,const修饰的对象到底是谁!修饰的是指针?还是修饰的是指针所指向的变量?
比如:
int const * const // ---> constant pointer to constant int
这里,const既修饰指针,又修饰int型数据( 也就是,指针所指向的变量 )!
注意以下区别:
int const p;
const int p;
这两个是等价的!const都是修饰变量p!当const只与基本数据类型( 或者自定义的数据类型 )放在一起时,const放在基本数据类型( 或者自定义的数据类型 )前面,与const放在基本数据类型( 或者自定义的数据类型 )后面,效果是等价的,都是修饰变量,使得变量的值不能发生改变!但是,此时,一般是将const放在基本数据类型( 或者自定义的数据类型 )前面!
当const、基本数据类型或者自定义的数据类型、*,放在一起时,就要注意,const修饰的究竟是谁!可以用上面说的方法,从右往左读,来辨别const修饰的究竟是谁!如果const没有修饰指针,那么const修饰的就是指针所指向的变量!也可能,const既修饰指针,又修饰所指向的变量!
以下几个经典:
(1)
int *const p;
从右往左读:const pointer to int
所以,const修饰的是指针变量p,指针变量p的值不能被改变!也就是,指针变量p只能,始终指向某一个变量,不能再指向其他变量!但是,指针变量p所指向的这个变量的值,是可以发生变化的!
(2)
const int p;
这里,只有const与基本数据类型int放在一起,所以,const修饰的是变量p,变量p的数据不能被改变!
(3)
const int *p; // 等价于 int const *p;
从右往左读:pointer to int const ---> pointer to const int
const修饰的是基本数据类型int,也就是,const修饰的是指针所指向的变量!这里从另外一个角度思考,const没有修饰指针,所以,const修饰的一定是指针所指向的变量!
所以,指针p的值是可以变化的,也就是,指针p可以指向不同的变量!但是,指针p所指向的变量的值是不能发生变化的!
(4)
const int *const p; // 等价于 int const *const p;
从右往左读:const pointer to int const ---> const pointer to const int
可见,const既修饰指针p,又修饰指针p所指向的变量!
所以,指针变量p的值不能被改变!也就是,指针变量p只能,始终指向某一个变量,不能再指向其他变量!而且,指针p所指向的变量的值,也不能发生改变!