1.const限定符
const限定符可以把一个对象转换成一个常变量,常量在定义后就不能被修改,因此定义时必修初始化。
const int bufSize = 512;//OK bufSize = 0;//error,bufSize是不可修改的左值 const int i;//error,未初始化
2.const与指针
2.1指向常量的指针变量
一般形式:
const 类型名 * 指针变量名;
const int * p1;//定义了指向常量的指针变量
说明:
const限定的是p1指针指向的对象,而不限定指针p本身;在定义时可以不初始化,允许重新赋值指向其他的const对象,但不能通过p改变所指对象的值
例子:
const int a = 10;//a是常量,必须定义时初始化且不能再改变 const int b = 15; const int *p1; p1 = &a;//ok *p1= 20;//error,试图通过指针p1改变它指向对象a的值 p1 = &b;//ok,指向是可以改变的 *p1= 20;//error,试图通过指针p1改变它指向对象b的值
分析:
本质上来说,由于没有方法分辩p1所指的对象是否为const,系统会把它所指向的所有对象都视为const。所以指向 const 对象的指针也可以指向 非const 对象。
例子:
int c = 15;//非const对象 p1 = &c;//ok,指向非const对象 *p1 = 20;//error
总结:
定义时可以未初始化,任何企图通过指向const对象的指针修改其值的行为都会导致编译出错。指针本身的值可以改变,这样指针变量p1就指向了不同的地址,对它进行解引用操作,就会得到不同的值。
在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指 向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
2.1.1继续分析
const int val = 15;//const对象 void *ptr2 = &val;//error,iconst nt * 无法转换为 int * const void *ptr3 = &val;
const int val = 15;//const对象 void *ptr2 = &val;//error,iconst nt * 无法转换为 int * const void *ptr3 = &val;
2.2常指针(const指针)
这种指针变量称为常指针变量,简称常指针,即指针值不能改变。
一般形式:
类型名 * const 指针变量名;
const int *p;
说明:
const限定的是指针变量,任何企图给const指针变量赋值的行为都会导致编译出错,能否通过该指针修改它所指向对象的值,取决于对象本身。
例子:
int a = 12,b = 15; int * const p = &a;//必须在定义时初始化 p = &b; //error,不能改变p的指向 *p = 20; //ok,可以通过指针变量改变指向的内容
总结:
指针变量的指向不变。
2.3指向常量的常指针
一般形式:
const 类型名 * const 指针变量名;
例子:
int a = 12,b = 15; const int * const p = &a;//必须在定义时初始化 p = &b; //error,不能改变p的指向 *p = 20; //error,不能通过p改变a的值 a = 20; //ok
总结:
指向常量的常指针即指针变量指向一个固定的对象,该对象的值不能被改变(不能通过指针变量改变对象的值)。
3.总结
那么如何记忆const与指针的关系呢?我们可以从const位于*的位置来记忆,如下:
const在*的左边即表示: 不能通过指针p修改其指向的内容;const int *p = &a;
const在*的右边即表示: 不能改变指针p的指向,即指针值int * const p =&a;