最近恰好在学习 浙江大学 翁恺 老师的《C语言程序设计》,老师对指针与const的见解颇深,感兴趣可在mooc搜索视频观看9.1-5节
在开始之前,先介绍一条const的规则:const默认与其左边结合,当左边没有任何东西则与右边结合。(来自知乎:C++里 const int* 与 int const* 有什么区别?)
那么首先先来谈谈const int *与int const *的区别与联系,由上面的规则其实很容易知道:const int *与int const *其实并无很大区别,可以根据个人编码习惯自行选择。它们都表示“不能通过这个指针去修改那个变量”。不过需要注意的是,这并不能使得那个变量成为const。下面举一个简单例子:
#include <stdio.h>
int main()
{
const int *p1;
int const *p2;
const int i = 0;
int m = 1;
int n = 2;
p1 = &i; //p1可以指向const int i
p1 = &m; //p1也可以指向int型变量m
//*p1 = 3; //[Error] assignment of read-only location '*p1',*p1是只读的
m = 3; //直接修改变量m的值是允许的
int *p3 = &i;
/*[Warning] initialization discards 'const' qualifier from pointer target type [enabled
by default],把const int的地址交给指向int的指针则会给warning*/
p2 = &i; //p2的结果与p1一致
p2 = &m;
//*p2 = 4; //[Error] assignment of read-only location '*p2'
m = 4;
return 0;
}
由上面代码可以看到,p1和p2既可以指向普通的int型变量,也可以指向const int,但是不能通过指针去修改变量。
而对于int *const,则是表示“一旦得到了某个变量的地址,不能再指向其他变量”,const此时修饰指针,这也符合上面介绍的规则。下面同样举一个简单例子:
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
int *const p3 = &m;
*p3 = 1; //允许通过指针修改变量的值
m = 1; //也允许直接修改变量的值
p3 = &n; //[Error] assignment of read-only variable 'p3',p3不能指向其他变量
p3++; //[Error] increment of read-only variable 'p3',不能对p3做加一操作
return 0;
}
最后总结一下: