【1】指向const对象的const指针
可以定义指向const对象的const指针,形式为:
const 指向类型 * const 指针变量名;
例如
const double pi = 3.14159;
const double * const p = π //p为指向const对象的const指针。
程序中,既不能修改 p 所指向对象的值,也不能修改该指针 p 的指向(即p中存在的地址值)可以从右至左理解上述定义:“p首先是一个const指针,它指向double类型的const对象”
【2】const指针
一个指针变量可以是只读的,称为const指针,定义形式为
指向类型 * const 指针变量名;
例如
int a =10,b =20;
int * const p =&a; //p是const指针 可以从右向左把上述定义语句理解为“p是指向int型对象的const指针”,与其他const变量一样,const指针的值不能改变,这就意味着不能使p再被赋值指向其他对象。任何试图给const指针赋值的操作,即使是给p赋回同样的值都会导致编译错误:
p=&b; //错误,p是只读的
p=p; //错误,p是只读的
p++; //错误,p是只读的
与任何const量一样,const指针必须在定义时初始化。
注:指针本身是const的并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型,例如,p指向一个非const的int型对象a,则可通过p间接引用修改该对象的值:
*p=100 //正确,a被修改。
【3】指向const对象的指针
一个指针变量可以指向只读对象,称为指向const对象的指针,定义形式为:
const 指向类型 * 指针变量名;
即在指针变量定义之前加const限定符,其含义是指针指向的对象是只读的,换言之,不允许通过指针来改变所指向的const对象的值。
例如:const int * p ;
这里 p 是一个指向const的 int 类型对象的指针,const限定了p指针所指向的对象类型,并非p本身,也就是说,p本身并不是只读的,在定义时 不需要对p进行初始化,可以给p重新赋值,使其指向另一个const对象,但是不能通过p修改其所指向对象的值。
例如:
const int a = 10,b = 20 ;
const int * p ;
p = & a; //正确,p不是只读的
p = & b; //正确,p不是只读的,可以改变p的值
*p = 42; //错误,*p是只读的 即p所指向的对象是只读的
《1》把一个const对象的地址赋给一个非const对象的指针变量是错误的,例如
const double pi = 3.14159;
double *p = π //错误 p是非const的指针变量
const double *p1 =&pi //正确,p1是const指针变量
《2》不能使用 void* 指针保存一个const 对象的地址,必须使用const void *指针保存const对象的地址,例如:
const int x = 42;
const void* p = &x; //正确,p是const指针变量
void* p1=&x ; //错误,x是const的,
《3》允许把非const对象的地址赋值给const对象的指针,例如:
const double p = 3.14159;
const double* p1 = &p; //正确,p1是const指针变量
double f = 3.14;
p1 = &f; //正确,允许非const的对象的地址赋给const指针;
f = 1.614; //正确,可以修改f的值
*p1 = 10.1; //错误,不允许通过引用p1来改变f的值
注:尽管f不是const对象,但是任何试图通过指针p1修改f的值的行为都会导致编译错误,p1一经定义,就不允许修改其所指向的值,如果该指针恰好指向一个非const对象时,同样必须遵守这个原则。
《4》不能使用指向const对象的指针修改指向对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指向的对象。例如:
double f, *p = &f;
const double* p1=&f ;
f = 3.14 ; //正确,f不是const 允许修改;
*p1 = 3.14; //错误,p1是const指针,不允许修改*p1;
*p = 2.72; //正确,ptr不是const指针,允许修改*p
程序中,指向const的指针实际上指向一个非const对象,尽管它所指的对象并非const,但是仍然不能使用p1去修改该对象的值。本质上来讲,由于没有办法分辨 p1 所指向的对象是否为const,系统会把它所指的对象都视为const。
如果指向const的指针所指的对象并非const,则可以直接给改对象赋值或者间接的利用非const指针修修改其值。毕竟这个对象不是const的:重要的是记住,不能保证指向const指针所指对象的值一定不被其他方式修改。
在实际编程中,指向const的指针常用作函数的形参,将形参定义为指向const的指针,以此确保传递给函数的实参对象在函数中不被修改。
可以定义指向const对象的const指针,形式为:
const 指向类型 * const 指针变量名;
例如
const double pi = 3.14159;
const double * const p = π //p为指向const对象的const指针。
程序中,既不能修改 p 所指向对象的值,也不能修改该指针 p 的指向(即p中存在的地址值)可以从右至左理解上述定义:“p首先是一个const指针,它指向double类型的const对象”
【2】const指针
一个指针变量可以是只读的,称为const指针,定义形式为
指向类型 * const 指针变量名;
例如
int a =10,b =20;
int * const p =&a; //p是const指针 可以从右向左把上述定义语句理解为“p是指向int型对象的const指针”,与其他const变量一样,const指针的值不能改变,这就意味着不能使p再被赋值指向其他对象。任何试图给const指针赋值的操作,即使是给p赋回同样的值都会导致编译错误:
p=&b; //错误,p是只读的
p=p; //错误,p是只读的
p++; //错误,p是只读的
与任何const量一样,const指针必须在定义时初始化。
注:指针本身是const的并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型,例如,p指向一个非const的int型对象a,则可通过p间接引用修改该对象的值:
*p=100 //正确,a被修改。
【3】指向const对象的指针
一个指针变量可以指向只读对象,称为指向const对象的指针,定义形式为:
const 指向类型 * 指针变量名;
即在指针变量定义之前加const限定符,其含义是指针指向的对象是只读的,换言之,不允许通过指针来改变所指向的const对象的值。
例如:const int * p ;
这里 p 是一个指向const的 int 类型对象的指针,const限定了p指针所指向的对象类型,并非p本身,也就是说,p本身并不是只读的,在定义时 不需要对p进行初始化,可以给p重新赋值,使其指向另一个const对象,但是不能通过p修改其所指向对象的值。
例如:
const int a = 10,b = 20 ;
const int * p ;
p = & a; //正确,p不是只读的
p = & b; //正确,p不是只读的,可以改变p的值
*p = 42; //错误,*p是只读的 即p所指向的对象是只读的
《1》把一个const对象的地址赋给一个非const对象的指针变量是错误的,例如
const double pi = 3.14159;
double *p = π //错误 p是非const的指针变量
const double *p1 =&pi //正确,p1是const指针变量
《2》不能使用 void* 指针保存一个const 对象的地址,必须使用const void *指针保存const对象的地址,例如:
const int x = 42;
const void* p = &x; //正确,p是const指针变量
void* p1=&x ; //错误,x是const的,
《3》允许把非const对象的地址赋值给const对象的指针,例如:
const double p = 3.14159;
const double* p1 = &p; //正确,p1是const指针变量
double f = 3.14;
p1 = &f; //正确,允许非const的对象的地址赋给const指针;
f = 1.614; //正确,可以修改f的值
*p1 = 10.1; //错误,不允许通过引用p1来改变f的值
注:尽管f不是const对象,但是任何试图通过指针p1修改f的值的行为都会导致编译错误,p1一经定义,就不允许修改其所指向的值,如果该指针恰好指向一个非const对象时,同样必须遵守这个原则。
《4》不能使用指向const对象的指针修改指向对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指向的对象。例如:
double f, *p = &f;
const double* p1=&f ;
f = 3.14 ; //正确,f不是const 允许修改;
*p1 = 3.14; //错误,p1是const指针,不允许修改*p1;
*p = 2.72; //正确,ptr不是const指针,允许修改*p
程序中,指向const的指针实际上指向一个非const对象,尽管它所指的对象并非const,但是仍然不能使用p1去修改该对象的值。本质上来讲,由于没有办法分辨 p1 所指向的对象是否为const,系统会把它所指的对象都视为const。
如果指向const的指针所指的对象并非const,则可以直接给改对象赋值或者间接的利用非const指针修修改其值。毕竟这个对象不是const的:重要的是记住,不能保证指向const指针所指对象的值一定不被其他方式修改。
在实际编程中,指向const的指针常用作函数的形参,将形参定义为指向const的指针,以此确保传递给函数的实参对象在函数中不被修改。