1 | int intelligence = 60; |
(っ °Д °;)っerror: increment of read-only location ‘* kio_intelligence’
不能改变指向值的指针
指向基本类型
这里主要利用const实现让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。
举个例子:
1 | int intelligence = 60; |
这样便不可用 *kio_intelligence 来修改intelligence的值,适用于某些时候怕意外修改某个变量的值。
那为什么不直接把intelligence设置为const呢?
大概是在某个块里面需要这个变量是只可读,但也确实有修改这个变量的需求的情况下使用。
kio_intelligence指向的值intelligence不是const变量,所以可以直接通过intelligence变量来修改intelligence的值,但不能使用kio_intelligence指针来修改它。
从上面的例子中引出了两个操作对象,变量和指向该变量的指针。
而每个操作对象有两种形态:普通形态和const形态。
两两组合便有四种可能:
- 普通指针指向普通变量
- const指针指向普通变量
- const指针指向const变量
- 普通指针指向const变量
感觉有点绕,但其实第一种是我们比较常用的,第二种上面例子也分析了
根据const特性来说,第三种导致的结果应该是直接使用变量和用指针访问变量都不能修改该变量的值,因为都为const了,这个应该没有问题,那第四种情况呢?
第四种情况是不被允许的,你想想本身const变量就不允许被修改了,那我们还试图想用指针来改变const变量,那这个const状态就没用了,所以c++是不允许你来打破规则的。
总结:
从结果上看,如果我们只是想用指针来读取变量的话,那请尽可能多用const指针吧,因为const指针可以访问普通变量和const变量,而普通指针只能访问普通变量。
另外const指针也可以避免无意见修改数据导致的编程错误。
指向另一个指针
结论上,仅当只有一层间接关系时,例如有一个指针指向基本数据类型时,才可以让另一个const指针指向这个非const指针。
1 | int age = 18; |
这时候p2也指向age,但是不能通过p2来修改age。
常常用在数组的遍历上
1 | int mouths[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; |
由于传进函数的是指向该数组第一个元素的指针(该元素是普通类型),所以如果只是想读取数组里面的值的话,用const指针可以避免不小心修改数组的可能性。
两级间接关系一般是不被允许的,即便允许也不是很安全,
如果被允许的话会导致下面的结果:
1 | const int **pp1; |
上面的式子,如果允许pp1指向p2的话,将会导致利用p2指针修改const变量n的效果。明显不是我们想要的。
另外
1 | const int mouths[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; |
数组为const数组时,函数必须使用const指针来指向该数组。
不能改变指向的指针
使用const来使得无法修改该指针的指向
1 | int intelligence = 60; |