牛客网刷题时看到一个有关指针和 const 的题,发现自己对这方面还是没有太理解,继续总结一遍
例题
以下有哪些错误:12345678910111213int 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到底修饰的是指针还是指针指向的变量,具体修饰方法,可参考从又到左的修饰方式,以下分别对语句进行分析:
- const int p1;//(1):const 修饰 int,可看成(const int) p1,p1指向const int,即不能修改p1指向的值(const),但可以修改p1指向的地址。
- int const p2=&i; //(2):int (const p2)=&i,const修饰 *p2,p2指向一个常量,即不能修改p2指向的值(const),但可以修改p2指向的地址。
- p2=&j;//(3):由2知3对
- int const p3=&i;//(4):int (const p3),const修饰p3,不可修改p3指向的地址。
总结
- const在前后表示不同的意义,const int 表示常变量,int *const 表示常指针。
- const int == int const ,如同 const int == int const 一样。
- 仅有常量指针,没有常量引用,因为引用就是另一个变量的别名,它本身就是一个常量。也就是说不能再让一个引用成为另外一个变量的别名。
- 由此可见,如果我们不希望函数的调用者改变参数的值。最可靠的方法应该是使用引用。
|
|
更多const关键字的解释,可以参考C/C++中const关键字详解