【C++】const+指针+引用
(一)指针和const
const关键字加在定义变量之前。说明定义的变量是一个常变量
1 | int a = 10; |
分析:
- (常指针)p1、p2 指向a的地址,const修饰的是p1 和 p2,所以p1和p2的值可以修改,p1 和 p2的值不可修改
- p3 指向a的地址,const修饰的是p3,所以p3的值不可修改,*p3的值可以修改
- p4指向a的地址,从右向左,第一个const修饰p4的值,第二个const修饰p4的值,所以p4和p4的值都不可修改
结论:
看准 const 和 * 的位置:
- const 在左边,const修饰 变量名;
- const 在*右边,const修饰 变量名;
(二)能力缩小定律
(1)小试身手
我们对(一)进行小小地修改,看下面那句代码编译错误?
1 | int a = 10; |
分析:
(1)从p指针的能力入手:p可改变,p也可改变
(2)const修饰 \p1 ,缩小p1的 *p1能力,可以编译通过;
(3)p2和p1一样,可以编译通过
(4)const 修饰p3的值,不影响p自身的能力,编译通过
(5)右const修饰p4,左const修饰*p4,p4 和 *p4都不可改变,可以编译通过
结论:编译通过
(2)小试身手
这次我们在p的前面加上const,那这次的编译结果呢?1
2
3
4
5
6
7
8
9
10int a = 10;
const int* p = &a;
int* p0 = p;
const int* p1 = p;
int const *p2 = p;
int* const p3 = p;
const int* const p4 = p;
*分析:
- 同样从p的能力入手,const修饰p,所以后面的语句有修改p的嫌疑都编译不通过
- p0拥有*p0能力,具有修改*p的嫌疑,编译不通过
- const修饰*p1和*p2,符合p的能力,可以编译通过
- const修饰p3的指向,没有限制*p3的能力,有修改*p的嫌疑,编译不通过
- 左const修饰*p4,右const修饰p4,限制了*p4能力,可以编译通过
结论:p0 p3编译不通过,其余可以编译通过
(3)小试身手
再次修改,那麽这次的编译结果呢?
1 | int a = 10; |
分析:
- 从p的能力入手,const修饰的是p的值,所有具有*p的能力
- 由于后面都是一级指针,无法通过同级指针来修改p的指向(p的值),所以全部都可以编译通过
结论:都可以编译通过
(三)指针+引用
也可以看看这种形式的使用,下面的编译情况呢??
1 | int a = 10; |
分析:主要难度就在后两句上,符号从右向左解释int *&s = p;
这句意思就是s是指针p的引用,所以可以编译通过int&* q = p;
这句话没有任何意思,编译错误
(四)指针+引用+const
在看懂上面的所有情况之后,再来看这种形式的使用,想必一定是手到擒来了吧,吧。
1 | int a = 10; |
(1)const修饰p
1 | int a = 10; |
(2)const修饰*p
1 | int a = 10; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 code-016!