C++ Const 与指针、引用关系

牛客网刷题时看到一个有关指针和 const 的题,发现自己对这方面还是没有太理解,继续总结一遍

例题

以下有哪些错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
int i=10;
int j=1;
const int *p1;//(1)
int const *p2=&i; //(2)
p2=&j;//(3)
int *const p3=&i;//(4)
*p3=20;//(5)
*p2=30;//(6)
p3=&j;//(7)
return 0;
}

回答__(1~7)

思考

解答问题的关键在于const到底修饰的是指针还是指针指向的变量,具体修饰方法,可参考从又到左的修饰方式,以下分别对语句进行分析:

  1. const int p1;//(1):const 修饰 int,可看成(const int) p1,p1指向const int,即不能修改p1指向的值(const),但可以修改p1指向的地址。
  2. int const p2=&i; //(2):int (const p2)=&i,const修饰 *p2,p2指向一个常量,即不能修改p2指向的值(const),但可以修改p2指向的地址。
  3. p2=&j;//(3):由2知3对
  4. int const p3=&i;//(4):int (const p3),const修饰p3,不可修改p3指向的地址。

总结

  • const在前后表示不同的意义,const int 表示常变量,int *const 表示常指针。
  • const int == int const ,如同 const int == int const 一样。
  • 仅有常量指针,没有常量引用,因为引用就是另一个变量的别名,它本身就是一个常量。也就是说不能再让一个引用成为另外一个变量的别名。
  • 由此可见,如果我们不希望函数的调用者改变参数的值。最可靠的方法应该是使用引用。
1
2
3
4
const int& ri = i;// 正确:表示不能通过该引用去修改对应的内存的内容。
int& const rci = i;// 错误!不能这样写。

更多const关键字的解释,可以参考C/C++中const关键字详解

本文标题:C++ Const 与指针、引用关系

文章作者:微石

发布时间:2018年05月21日 - 09:05

最后更新:2018年07月19日 - 11:07

原始链接:akihoo.github.io/posts/1ea00de7.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。