2010/11/2
关键字:指针和const限定符
用const限定指针
唯一的作用是不能通过解引用该指针的方式修改所指向的对象的值.
const int *p; //const指针声明时可以不初始化,虽然是不被推荐的
const int val1 = 0;
int val2 = 0;
p = &val1; //const指针可以指向const对象
p = &val2; //const指针可以更改指向的对象,并且可以指向非const对象
*p = 2; //错误,不能通过解引用的方式修改const指针所指向的对象,无论对象是非const还是const,这是const指针的唯一限定
int *p2 = 0;
p2 = &val1; //错误,不能用非const指针指向const对象
const指针
const指针,本身的值不能修改,即不能修改指针所指向的对象(地址).一旦初始化就不能再次赋值.
int *const p3; //错误,const类型对象(包含指针)必须初始化
const int *p4; //正确,p4是"指向const对象的指针",本身并非const类型,可以不用初始化
int main()
{
int val = 0;
int *const p = &val; //const指针是限定指针一旦初始化就不能再次赋值,对指向const还是非const对象无限制
p = &val; //错误,const指针一旦初始化就不能再次赋值,即使是赋值给之前指向的对象(地址)
p = p; //错误,const指针一旦初始化就不能再次赋值,即使是用自身赋值
*p = 1; //const指针不限制对象赋值
int const *p1; //等同于const int *p1;
int *const p2; //const指针必须在声明时初始化
return 0;
}
指向const对象的const指针
const int val1 = 0;
const int *const p5 = &val1;//包含const指针和指向const对象的指针的特性
//1.一旦初始化就不能修改所指向的对象
//2.不能通过解引用修改所指向的对象的值
typedef和const
const int *p = 0;
实际上const和int是可以互换的,即const int *p等同于int const *p.
同理下面的也就好理解了:
typedef string *pstring; //声明的是指向string的指针类型
const pstring cstr; //等同于pstring const cstr、string *const cstr,看不出类型声明来可以互换const和类型
小窍门:const的声明比较费解时,可以采用和类型互换的方式分析.