本文出自【悠然品鉴】转载请注明出处:http://www.youranshare.com/blog/sid/21.html
本文观点纯属小编个人理解,如有错误,请指出.
大家都知道 const 修饰的变量是只读属性,那么下面5种 const 使用方法你能够分清吗?
->第1个================
int n = 50; int const m = n;
->第2个================
int n = 50; int const *p = &n;
->第3个================
int n = 50; const int *p = &n;
->第4个=================
int n = 50; int* const p = &n;
->第5个=================
int n = 50; const int* const p = &n;
********************************************************
如果你能很好的区分它们的话,那你就不用再往下看了 ^v^;
--》对于 第1个,“int const m = n;”
我想大多数童鞋都应该很了解吧,
m 变量类型是 const ,所以m所存储的内容不可被修改,
即是 m 被【赋值】为50后不可以再次修改(由于m是const类型,在定义时 必须要进行 初始化操作!!!)
--》第2个,“int const *p = &n;”
p是一个 int 指针,const 修饰的是 “*p”这个整体,
此时 如果对 *p 所存的数据重新赋值则会出错,
例如:
*p = 10;//错误原因:error C2166: l-value specifies const object.
但是 如果对 n 进行 n = 10; 重新赋值 却不会 报错。
这是因为 虽然 n 与 *p 所表示的是同一个 内存单元,
但是 n 与*p的 flag标志寄存器 内容不同,n 变量允许读写操作,而 *p变量
只有 读取 权限。所以导致了 n与 *p 虽然表示的是同一个内存单元,但是他们却拥有不同的操作权限。
--》第3个,“const int *p = &n;”
同样 p 依然是一个指针,但是这时 const 的位置不同,
毋庸置疑 const 修饰的肯定是 它右侧的内容,
所以,此时 const 仍然修饰的是 *p;
同2, 如果对 *p 所存的数据重新赋值则会出错,
例如: *p = 10;//错误原因:error C2166: l-value specifies const object.
--》第4个,“int* const p = &n;”
不同于2 和 3,const 修饰关键 是 p,
即是说 p指针是 const 类型,p 不可以被 重新初始化;
例如 执行:
n = 11;//正确 *p = 10;//正确 p++;//错误 原因:error C2166: l-value specifies const object.
--》第5个,“const int* const p = &n;”
不同于前几个,这里出现了 两个 const,
但是观察 const 所修饰的关键位置不难 理解:
右边的 const 所修饰的 是p,
左边的 const 所修饰的 是*p,
即是说 p 和 *p 均不能 被修改,
例如执行下列操作:
n++;//正确 p++;//错误 原因:error C2166: l-value specifies const object. *p++;//错误 原因:error C2166: l-value specifies const object.
************************************************************************************************
总的来说:
要想分清 const 所修饰的是哪个变量,
仅需看 const 右边 有哪些变量,右边有关键字的话,就去掉关键字不考虑,
****例如:**************
int const *p;//右边是 *p 即是说 const 修饰 *p; int const p;//右边是 p 即是说 const 修饰 p; const int *p;//不考虑 关键字 int,即是说 const 修饰 *p; const int* const p;//逐个进行分析可以看出 左边 const 修饰 *p,右边 修饰 p;
**********************
好吧,教程 就到此 结束~~~