const 限定符它把一个对象转换成一个常量,const与define。两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。
const和指针一起用时会有些有趣,我们下面一一分析一下各种情况:
例子:
int year = 2017;
const int *pt = &year;
这是一个典例,pt 指向一个const int,你可以直接把const int 假装当作是一个类型,就好理解定义的意思了,比如 int * pt = &year;就是pt指向一个int变量的指针, double * pt =&year;就是pt 指向一个double变量的指针,const int * pt = &year; pt就是一个指向 const int的指针。 含义为: 不能通过指针pt来改变year的值!但是!我可以直接通过year本身来改变它的值。
这种操作看起来好像没什么用,但是其实是有用的,比如当用函数中的按地址传递时,我们很多时候就是把变量的地址传入函数中去执行一些操作,这个时候限定我无法用地址来改变一些值就显得很有用处了。后面的博文中有机会会看到这样的例子。
注意:
①上面代码的例子,我是将一个常规变量 的地址赋值给了指向const的指针。这是合法的。
②还有一种情况,将 const 变量的地址赋值给 指向const的指针,
const int month= 6;
const int * pt2 = & month;
合法的操作,这样我既不能通过month来修改它的值,也不能通过它的地址修改它的值,这样这个变量在正常情况下就形成了“绝对防御”了,我无法改变它的值。
③将 常规变量的地址赋值给常规指针,这个就是我们常见的操作,不讨论了;
④将 const变量的地址 赋值给 常规变量指针,不合法!!!
例如:
const int day= 3;
int * pt3 = & day; //不合法
为什么不合法?因为我第一句已经说了是一个const int,但是如果我允许指针来修改它的值的话,那岂不是实力打脸了? 综上,当变量和指针分别为const情形这2x2=4种情况要区分好。常规指针只能指向常规数据地址。
将指针参数声明为指向常量数据的指针有两条理由: · 这样可以避免由于无意间修改该数据而导致的编程错误; · 使用const使得函数能够处理const和非const实参,就如我上述①②,否则只能接受非const数据,如情况③。 这里还要注意一点,上述说的是不能通过指针来修改变量,然后也说了可以通过变量本身来修改变量, 但是 还应该补充一点,相信大家也应该会想到这样的情况,就是是否可以修改指针自己的值? 答案是:可以! 也就是不管你变量和指针自己玩的多欢,就是不许你通过指针去修改变量。不管大陆和中国台湾各自玩的多high,就是不许你中国台湾去代表中国搞事情,就是这个意思吧~
好了说了这么多,来看第二类情况了
来看两个语句:
int province = Taiwan;
const int *pt1 = &province;//A
int *const pt2 = &province;//B
好了现在来找不同,很明显A和B两个语句const的位置不一样, 语句A上文已经研究了,指向 const int 的一个指针 pt1,不能通过pt1来修改province 语句B。这里的意思是,声明了一个 指向int 类型的 const 指针 pt2,pt2现在自己都不能修改自己的值了,因为 指针本身被声明为了常量。 所以情况1中,我的用于是指向const对象的指针,强调的是对象是const的,而情况2中,我们就应该说是const指针,因为指针本身是const 的。