一 const的基本概念
const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。
二 const修饰基本数据类型
2.1 const修饰一般常量及数组
int const a = 100;
const int a = 100; //与上面等价
int const arr [3] = {1,2,3};
const int arr [3] = {1,2,3};//与上面等价
2.2 const修饰指针(*)
char *p = "hello"; // 非const指针,非const数据
const char *p = "hello"; // const数据
char * const p = "hello"; // const指针
const char * const p = "hello"; // const指针,const数据
char str[] = "I LOVE CHIAN!";
const char* p;//常量指针
//代表p指向的东西不能通过p来修改(p指向的目标,那个目标中的内容不能通过p来修改);
p = str;
*p = 'Y';//此时这里会编译错误
p++;//地址也可以被改变;
//虽然不能修改*p,但可以通过其他修改;如:
str[0] = 'Y';//这样通过修改str中的内容可以修改*p中指向的内容,即间接修改
char str[] = "I Love China!";
char* const p = str;//指针常量
//此时char *const p定义的时候必须初始化。
//p一旦指向了一个东西之后,就不可以在再指向其他东西了。即p++不可以用了
//事例如下:
p++;//这里会报错p不能再改变;
*p = 'Y';//这里不会报错,指向的内容可以被修改;
总结:const char*p(char const*p)与char* const区别:
(1)const char*p(char const*p)指向的内容不能再改变
char* const p指向的内容可以再被改变
(2)const char*p(char const*p)指向的地址可以被改变,即可以p++
char* const p指向的地址不能再改变,即不可以p++
(3)const char* const p(char const* const p):指向的内容和地址都不能再被改变
2.2.1 常量指针(const *)
当为常量指针时,不可以修改常量,但是可以修改指针指向别的。
指针变量保存的地址可以改变,指向的对象的内存值不能修改
int a = 5;
const int *p =&a;
*p = 20; //error 不可以通过修改所指向的变量的值
int b =20;
p = &b; //right 指针可以指向别的变量
2.2.2 指针常量(* const)
当为指针常量时,不可以修改指针指向,但是可以修改常量。
指针变量保存的地址不可修改,但内存值可以修改
int a = 5;
int *const p = &a;
*p = 20; //right 可以修改所指向变量的值
int b = 10;
p = &b; //error 不可以指向别的变量
左定值,右定向,const修饰不变量
如果const既修饰指针又修饰值如下
//常量指针,指针修饰得是p指向的值
const char* const p
那么既不能修改指针地址,也不能修改指针指向的值。
三 const修饰函数
const 在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。
const int fun (const int a) const;
3.1 const修饰函数参数
修饰函数形参;函数体内不能修改形参a的值。
如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。
所以:const 只能修饰输入作用的参数
3.1.1 如果参数为指针
如果输入参数为指针,加上const之后就会起保护指针意外修改的作用。
void StringCopy(char* strDest, const char* strSource);
在这个函数定义中,我们的的参数strsource加上const修饰,就是为了防止strsource被修改。
可以起到保护作用的原因是:
实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。形参加上const 修饰之后,保护了这一块内存地址不被修改,如果刻意修改这一块内存,编译器会报错。