const属于变量属性的一种。使用const修饰的变量,意味着该变量是一个只读变量,不能随意的修改该变量的值。但并不意味着,经过const的修饰,该变量就变成了常量,本意上并不是常量,只是一个只读变量。app
int main(){ const int apple = 1; apple = 2; //error system ( "pause" ); return 0; }
此时,经过const修饰变量apple,此时就是只读变量(read only variable)。那么是否,该内存中的值真的没法改变。事实并不是如此。咱们能够经过声明指针指向该内存空间,经过这个指针,咱们是可以修改变量的值的。代码以下:ide
int main(){ const int apple = 1; int* p = NULL; p = ( int* )&apple; printf ( "apple = %d\n", apple ); *p = 2; printf ( "apple = %d\n", apple ); system ( "pause" ); return 0; }
咱们经过这个指针变量修改了内存中的值。
当咱们经过const来修饰一个全局变量时,它一样是一个只读变量,没法直接修改其值。函数
const int glo_apple = 3; int main() { glo_apple = 4; //error system ( "pause" ); return 0; }
很显然,因为glo_apple是只读变量,在主函数中是没法修改其值的。那么,咱们是否能够用一样的方式,声明一个指针指向全局变量,对全局变量glo_apple进行操做呢?指针
const int glo_apple = 3; int main() { int* glo_p = ( int* ) &glo_apple; *p = 4; //error printf ( "glo_apple = %d\n", glo_apple ) ; system ( "pause" ); return 0; }
若是将这段代码用现代编译器编译一下,会发现,程序会报错。为何呢?缘由就在于,用const修饰的全局变量被存放在了“只读存储区”了。用指向全局变量的指针去修改内存中的值确定会报错。
注意:现代C编译器中的const将具备全局生命周期的变量存储于只读存储区。(好比static局部变量也是具备全局生命周期,因此,用const修饰的static局部变量也是存储于只读存储区)
注意:因为字符串字面量被存储于只读存储区,也就是说,该值是不但愿也不能被改变的,因此须要使用const来修饰指针变量指向字符串字面量。例如:
const char p = "chentong";
另外,用const修饰的函数参数,说明不但愿在函数内部修改参数的值。用const修饰函数返回值,说明函数的返回值不可变,多用于返回指针的类型。好比,有以下代码:code
#include <stdio.h> #include <stdlib.h> const char* f ( const int i ){ i = 4; //error; return "chentong"; } int main() { const int* p = f( 2 ); printf ( "%s\n", p ); pc[4] = 'o'; //error printf ( "%s\n", p ); system ( "pause" ); return 0; }
首先,函数的参数i不能在函数内部被修改,由于它是一个被const修饰的只读变量。其次,函数的返回值类型是一个const类型的,也就是意味着,函数返回值不可修改,是个只读变量,所以,在用指针指向这个函数时,须要用const来修饰该指针。并且,不能经过指针去修改函数的返回值。生命周期