自己在VCKBASE上,总是听到有人问 const int *p 与 int const *p 与 int *const p 有什么区别,我自己也回答了很多次,这次又看到有人问,想想自己应该记录下来,虽然这个问题很简单,几乎每一本讲 C 基础的书上都会说明。
自己还没有(也不能完成)仔细的说出 const 有几种用法,但是我下面将会说出我所知道的用法。
下面的代码,使用 VC6 在 WindowsXP 上编译运行
1、用作变量修饰符 const可以在定义变量时作为修饰符,用来表示该变量不可修改。需要注意的是:const修饰某个变量时,总是限定const所处位置的右侧。例如代码
const int nc = 0
;
用来声明一个整型常量 nc,这个常量不可更改。假如执行下面的语句
int main(int argc, char* argv[])
{
constint nc = 0;
nc = 1; //修改了常量 nc,不能编译过去
return 0;
}
编译时会报错“l-value specifies const object” 需要说明的是,声明变量时,const int nc = 0 与 i nt const nc = 0 意义是一样的,个人推荐使用后面一种 i nt const nc = 0 ,这样别人在看代码的时候,可以先很快的知道 nc 是常量。 大家看完我上面所说的,可能更好的理解下面我所说的 int const *p 与 int *const p 的区别。 前面我也说了,const 是修饰它位置右侧的,所以 int const *p 主要是修饰 *p 为常量,也就是说 *p 的值不能改变;而 int *const p 则是修饰 p 为常量,也就是说指针 p 为一个常量指针。可以根据下面的代码来加深印象
int main(int argc, char* argv[])
{
int n = 0;
int m = 1;
intconst *p1 = &n;
int * const p2 = &n;
p1 = &m;
(*p1) = m; //这里编译出错,错误为 “error C2166: l-value specifies const object”