定义

  1. const type name = value;

变量名是一块内存的别名,const 修饰符限制了我们不能通过变量名来修改内存的值。

const 和 type 都是用来修饰变量的,它们的位置可以互换,也就是将 type 放在 const 前面。使用了 const 之后我们不可以直接去修改变量的值,但是可以通过指针去修改,我们一般把这种类型称为只读变量。

const 是在高级语言的语义层面上定义的,只是编译器在编译期做语法检测来保证,运行时,const 变量和普通变量完全一致

const 和指针

const 也可以和指针变量一起使用,可以限制指针变量本身,也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序,如下所示:

1、const int A; //const修饰指向的对象,A可变,A指向的对象不可变
2、int const
A; //const修饰指向的对象,A可变,A指向的对象不可变
3、int const A; //const修饰指针A, A不可变,A指向的对象可变
4、const int
const A;//指针A和A指向的对象都不可变

const 离变量名近就是用来修饰指针变量的,离变量名中间隔了任何东西就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

const 和函数形参

在C语言中,单独定义 const 变量没有明显的优势,完全可以使用 #define 命令代替。const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。

const 和非 const 类型转换

当一个指针变量 str1 被 const 限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将 str1 赋值给另外一个未被 const 修饰的指针变量 str2,就有可能发生危险。因为通过 str1 不能修改数据,而赋值后通过 str2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。

全局和局部

全局 const 变量,放在常量区受到常量区的保护,即使通过指针也无法修改,局部 const 变量存放在栈区。