const关键字
const
关键字在 C 和 C++ 编程语言中用于定义常量,即那些一旦初始化后其值就不能被修改的变量。
一、const的作用
1、定义变量为常量
const int N = 100;//定义一个常量N
int const N = 100;//同上,定义一个常量N,修饰符const用在类型说明符前后都可以
N = 50;//错误,常量的值不能被修改
const int n;//错误,常量在定义的时候必须初始化
2、修饰常数组
int const a[5] = {
1,2,3,4,5};
const int a[5] = {
1,2,3,4,5};
3、修饰函数常参数
void print(const char* message) {
// message 不应该被函数修改
printf("%s\n", message);
}
//表示传递的参数不可被改变
4、修饰函数返回值
const int getConstValue() {
return 42;
}
//表示返回值不可被改变
5、修饰指针
如果关键字const出现在星号左边,表示被指物是常量;
如果出现在星号右边,表示指针自身是常量;
如果出现在星号两边,表示被指物和指针两者都是常量。
const int* ptr;
int const* ptr;
int* const ptr;
const int* const ptr;
1.”const int” & “int const”
const放在数据类型(int)前面和数据类型(int)后面是一样的,等价。
即:const int *ptr = int const *ptr
2.简单理解“const int *ptr”, “int * const ptr”,“const int * const ptr”, 的本质含义
在英文里面,”*“ 被念做,pointer to,朗读的顺序是从右到左。所以
const int *ptr = ptr pointer to const int(指向常量的指针)
int const *ptr = ptr pointer to const int(指向常量的指针)
指向常量的指针,是指指针本身并不是常量,而指针所指向的内容是一个常量。因此,指向常量的指针,指针本身可以被修改,但*ptr也就是指针所指向的内容不能被修改。
int * const ptr = const ptr pointer to int(指向整型的指针常量)
指向整型的指针常量,是指指针本身是常量,而指针所指向的内容不是常量。因此,指向整型的指针常量,指针本身不能被修改,而指针所指向的内容可以被修改。
const int * const ptr = const ptr pointer to const int(指向常量的指针常量)
指向常量的指针常量,按照前面所说,是指指针本身是常量且指针所指向的内容也是常量。因此,指向常量的指针常量,指针本身和指针所指向的内容都不能被修改。
3.例如:
(1)const int* ptr与int const* ptr
const int myConst = 10;
const int* ptr = &myConst;
*ptr = 20; // 错误:不能通过 ptr 修改 myConst 的值
ptr++; // 正确:可以改变 ptr 的指向
(2)int* const ptr
int myConst = 10;
int* const ptr2 = &myConst;
*ptr2 = 20; // 正确:可以通过 ptr2 修改 myConst 的值
ptr2++; // 错误:不能改变 ptr2 的指向
(3)const int* const ptr
const int myConst = 10;
const int* const ptr3 = &myConst;
*ptr3 = 20; // 错误:不能通过 ptr3 修改 myConst 的值
ptr3++; // 错误:不能改变 ptr3 的指向c
二、#define和const的区别
-
定义的区别
- 宏用#define声明,const常量用const+数据类型声明
- 宏最后没有分号,const常量声明需要用分号表示语句结束
- 宏不需要用等号赋值,const常量需要用等号赋值
-
处理的阶段不同
- 宏定义在预处理阶段进行文本替换
- const常量在程序运行时使用
-
存储方式不同
- 宏定义是直接替换,不会分配内存,存储于程序的代码段
- const常量需要进行内存分配
-
是否进行类型检查
- 宏定义是字符替换,不进行类型检查
- const常量定义时需要声明数据类型,使用时会进行类型检测
-
宏定义可以声明函数
-
定义后能否取消
- 宏定义可以通过#undef来使之前的宏定义失效,取消后可以重新定义
- const常量定义后将在定义域内永久失效