const是constant的缩写,本意是“不变的、不易改变的”,它属于c、c++、Java等高级语言中的关键字,通常用来修饰变量对象、函数参数、c或c++指针对象使用。
const在实际编程中起着至关重要的作用,本文主要讲解它在编程中的不同含义。
章节预览:
章节内容:
1. 变量修饰
【例1】 int const a;
示例代码:
int const a = 5;
int b = a; //正确
b = 6; //正确
a = 6; //错误
const int *p = &a; //正确
*p = 6; //错误
p = 0; //正确
示例分析:
- 定义一个int类型常量a,a的值为5;
- 定义一个int类型b,b初始化赋值为a;
- b赋值为6;
- a赋值出错,a的值不允许修改;
- 定义一个int类型常量指针p,并指向常量a的地址;
- p指向的内存赋值出错,a的值不允许修改;
- p地址赋空地址,a的地址不变。
示例概况:
- 定义(类型 + const + 对象)形式,必须初始化赋值;
- 对象在生命周期内不允许赋值,即对象值不允许修改;
示例相似情况:
- (int const a)、(const int a)都属于常量对象,所表达的含义相同。
2. 指针修饰
【例2】 const int *p;
示例代码:
const int *p;
int a = 5, b = 6;
p = &a; //正确
*p = 6; //错误
p = &b; //正确
*p = 7; //错误
示例分析:
- 定义一个常量int类型指针p;
- 定义一个int类型a,初始化赋值为5;
- 定义一个int类型b,初始化赋值为6;
- p地址赋变量a的地址;
- p指向的内存赋值出错,a的值不允许修改;
- p地址赋变量b的地址;
- p指向的内存赋值出错,b的值不允许修改;
示例概况:
- 定义(const + 类型 + *(*在定义处表示指针声明,*的数量表示指针的维数) + 对象)形式,允许不进行初始化赋值;
- 指针对象在生命周期内允许赋地址,即对象地址允许修改;
- 指针对象在生命周期内不允许赋值,即对象值不允许修改;
示例相似情况:
- (const int *p)、(int const *p) 、(const int const *p)都属于常量指针,所表达的含义相同。
【例3】 int * const p;
示例代码:
int a = 5, b = 6;
int * const p = &a;
*p = 6; //正确
p = &b; //错误
示例分析:
- 定义一个int类型a,初始化赋值为5;
- 定义一个int类型b,初始化赋值为6;
- 定义一个int类型指针常量p,并指向变量a的地址;
- p指向的内存赋值为6,即a的值为6;
- p地址赋变量b的地址出错,p的地址不允许修改;
示例概况:
- 定义(类型 + * + const + 对象)形式,必须初始化赋值;
- 指针对象在生命周期内允许赋值,即对象值允许修改;
- 指针对象在生命周期内不允许赋地址,即对象地址不允许修改;
示例相似情况:
- (int * const p)属于指针常量,只有这一种定义形式。
【例4】 const int * const p;
示例代码:
int a = 5, b = 6;
const int * const p = &a;
*p = 6; //错误
p = &b; //错误
示例分析:
- 定义一个int类型a,初始化赋值为5;
- 定义一个int类型b,初始化赋值为6;
- 定义一个常量int类型指针常量p,并指向变量a的地址;
- p指向的内存赋值出错,a的值不允许修改;
- p地址赋变量b的地址出错,p的地址不允许修改;
示例概况:
- 定义(const + 类型 + * + const + 对象)形式,必须初始化赋值;
- 指针对象在生命周期内不允许赋值,即对象值不允许修改;
- 指针对象在生命周期内不允许赋地址,即对象地址不允许修改;
示例相似情况:
- (const int * const p)、(int const * const p)、(const int const * const p) 都属于常量指针常量,所表达的含义相同。
本节概况:
- 指针常量:指针地址不允许修改,但指针指向的内存值允许修改;
- 常量指针:指针地址允许修改,但指针指向的内存值不允许修改;
- 常量指针常量:指针地址和指针指向的内存值都不允许修改。