1、有两种不同的方式将const关键字用于指针,第一种是让指针指向一个敞亮对象,这样可以防止使用该指针来修改所指向的值。第二种是将指针本身声明为常量,这样可以防止改变指针指向的位置。看细节:
声明一个指向常量的指针pt,
int age =39 ;
const int * pt= &age ;
该声明表示,pt指向一个const int (这里为39),因此不能用pt来修改这个值,换句话来说, *pt的值为const,不能被修改。这里容易出错的地方在于,pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对于pt来说,这个值是常量。例如,pt指向 age,而 age 不是const,可以直接通过age变量来修改age的值,但是不能用pt指针来修改:
*pt=20;//不合法,因为pt指向const常量
age=20; //合法,因为age不是const常量;
2、如果数据类型本身并不是指针,则可以将const数据或者非const数据的地址赋给指向const的指针,但是只能将非const数据的地址赋给非const指针。
3、 const float g=9.8;
const float *p=&g; // 合法
const float gm=1.63;
float *p1=&gm; // 不合法
C++禁止将const的地址赋给非const指针;如果非要强制赋值,则可以用强制类型转换来突破这种限制;但是对于将指针指向指针的情况,涉及的是一级间接关系,则将非const指针赋给const指针是可以的。
int age=33; int *pd=&age; const int *pt=pd; 是合法的;
4、假设有一个const数据组成的数组:
const int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
则禁止将常量数组的地址赋给非常量指针,将意味着不能将数组名作为参数传递给使用非常量形参的函数;
int j = sum(mon,12);不合法;
5、在条件允许时,尽可能使用const,将指针参数声明为指向常量数据的指针有两条理由:
a:可以避免由于无意间 修改数据而导致的错误;
b:使用const使函数能够处理const和非const实参,否则将只能接受非const数据;
所以,条件允许,将指针形参声明为指向const的指针;