对于一个普通指针typet *p。p有三个最基本的能力,第一就是可以通过p = &obj来指向一个type类型对象,并随意切换指向对象。第二就是通过value = *p来读取它指向的对象的值。第三个就是通过*p = value来修改它指向的对象的值。
在普通指针上加const,根据const位置的不同,会得到一些特殊的指针。相对于普通指针,它们丧失了一些能力,可以算是阉割版的指针。
(1)在type前面加const,得到const type *p。这种指针失去了修改指向对象的值的能力,即不能通过*p = value去改变对象的值。
这种指针有什么用呢?在C语言中,参数的传递总是采用值传递,这种方式在传递一些内置的数据类型时,效率没有太大影响,但是在传递复杂的结构体时,值传递的方式由于要进行复制操作,程序效率就会受到比较大的影响,这时候传递指针效率就高多了。但是传递普通指针的话,人们又担心会在不需要修改实参的值的情况下,不小心修改了实参的值,所以总是要小心翼翼。自从有了const type *p这种指针,由于它失去了修改对象的值的能力,所以人们对它就放心了。以后,再需要传递指针提高程序性能,又不想改变实参的时候,我们就用const type *p。
容易想到,还有一种情况也需要用const type *p,那就是指向const对象时,必须用const type *p。
(2)在p的前面加const,得到type* const p。这种指针则失去了随意切换指向对象的能力,即不能通过p = &obj来随时改变它指向的对象。所以这种指针从一开始定义就要初始化它的指向,以后再也不能更改,即必须从一而终。但通过它对指向的对象进行读写操作都是没问题的。如果不希望p的指向发生改变,就可以用这种指针。
(3)如果在type前面和p前面都加上const,就得到const type* const p。这种指针只能指向固定的对象,并且只能读取而不能修改对象的值。