一、const关键字简介
const是单词constant的简写,若一个变量前用const修饰,就意味着该变量里的数据可以被访但不能被修改,即该变量是“只读”的。
二、const关键字的用法
1. 用于修饰局部变量
例如:
const int n = 5;
int const n = 5;/*二者是等价的,均表示变量n的值不能被改变了*/
注意:在使用const修饰变量时,一定要给变量初始化,否则之后就不能赋值了!
2. 常量指针与指针常量
常量指针 是说指针指向的内容是常量,例如:
const int *n;
int const *n; /*二者等价*/
注1:常量指针是说不能通过这个指针改变变量的值,但是可以通过其他引用来改变变量的值,例如下面这种:
int a = 5;
const int *n = &a;
a = 6;
注2:常量指针的值不能改变,但这不意味着指针本身不能改变,常量指针可以指向其他的地址,例如下面这种:
int a = 5;
int b = 6;
const int *n = &a;
n = &b;
指针常量 是说指针本身是个常量,不能再指向其他的地址,例如:
int * const n; /*指针常量*/
注:指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向该地址的指针来修改,例如:
int a = 5;
int *p = &a;
int * const n = &a;
*p = 8;
常量指针、指针常量一会儿就把人绕晕了,那么如何区分他们呢?别急,请往下看。
一个简单的方法是看 * 的位置,如果我们将 * 读作“指针”,将 const 读作“常量”的话,则正好可以根据二者的前后顺序来辨别,例如:
int const *n; /*是常量指针*/
int * const n;/*是指针常量*/
指向常量的常指针:指针指向的位置不能改变且也不能通过这个指针改变变量的值。(但是仍然可以用其他的普通指针改变变量的值)
const int * const p;/*指向常量的常指针*/
3. const修饰函数的参数
1)防止修改指针指向的内容,如:
void StringCopy(char *dst, const char *src);
2)防止修改指针所指向的地址,如:
void swap(int * const p1, int * const p2);
4. const修饰函数的返回值
例如,若有如下函数:
const char* GetString(void);
当用以下语句来接收函数返回值时将出错:
char *str = GetString(); /*错误*/
应当改写为:
const char *str = GetString(); /*正确*/
三、const与宏定义#define的区别
宏定义只是对值进行简单的替换,不进行类型检查;而const有具体的类型,在编译阶段会进行类型检查
#define宏是在预处理阶段展开,而const常量在编译运行阶段
const定义的常量在程序的运行过程中只有一份拷贝(因为是全局的只读变量,故存在静态区);而#define定义的常量在内存中有若干个拷贝
const效率高,因为编译器通常不为普通const常量分配内存,而是保存在符号表中,没有了存储与读取的操作,效率很高
参考博客:https://blog.csdn.net/M_joy666/article/details/80470656