const是constant的简写,用来定义常量,它限定一个变量不允许被改变,产生静态作用。const最开始推出的目的是为了取代预编译指令,取长补短。好处如下:
常量一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后
int const x=2;
//或
const int x=2;
当然,我们可以偷梁换柱进行更新: 通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值
// const对于基本数据类型, 无论写在左边还是右边, 变量中的值不能改变
const int a = 5;
// a = 666; // 直接修改会报错
// 偷梁换柱, 利用指针指向变量
int *p;
p = &a;
// 利用指针间接修改变量中的值
*p = 10;
printf("%d\n", a);
printf("%d\n", *p);
修饰常数组(值不能够再改变了)定义或说明一个常数组可采用如下格式:
int const a[5]={1, 2, 3, 4, 5};
const int a[5]={1, 2, 3, 4, 5};
修饰函数的常参数const修饰符也可以修饰函数的传递参数,告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无 意的或错误的修改。
void Fun(const int var){
//函数内部只是读取var 不能修改var
}
修饰函数的返回值: const修饰符也可以修饰函数的返回值,使得调用者不能修改函数返回值,格式如下:
const int Fun1();
const MyClass Fun2();
修饰指针
使用const修饰指针不同位置会导致不同的变化
const int *A; //const修饰指针,A可变,A指向的值不能被修改
int const *A; //const修饰指向的对象,A可变,A指向的对象不可变
int *const A; //const修饰指针A, A不可变,A指向的对象可变
const int *const A;//指针A和A指向的对象都不可变
技巧:
*
的位置*
的左侧 表示值不能修改,但是指向可以改。*
的右侧 表示指向不能改,但是值可以改*
的两侧都有const 标识指向和值都不能改。全局变量的作用域是整个文件,且全局变量的生存周期为程序运行的整个过程,所以我们应该尽量避免使用全局变量,一旦某个函数改变了全局变量的值,会影响到其他引用这个变量的函数,是一个很隐蔽的操作(很难找到谁改的)。如果一定要用全局变量,应该尽量的使用const进行修饰,防止不必要的人为修改
typedef int * pint;
#define PINT int *
int main(int argc, char* argv[])
{
int i1 = 1, i2 = 2;
const pint a=&i1; //p1本身地址不可更改,p1指向的内容可以更改
const PINT b=&i2;//p2本身地址可以更改, p2指向的内容不能更改
// *a=3; //换内容是可以的
// a=&i2; //换地址不行 Cannot assign to variable 'a' with const-qualified type 'const pint' (aka 'int *const')
printf("%d\n", *a);
// b=&i2; // 换地址是可以的
// *b=1; //换内容不行 ,Read-only variable is not assignable
printf("%d\n", *b);
return 0;
}
所以建议在使用typedef 定义指针的时候就指定const 比如:typedef const int * pint;
这样之后在使用的时候就不能改变地址内的值了