const 变量表示常量,更加准确的表达应该是只读的变量,通常可理解为不能变。通常用来修饰指针和数组,修饰变量用的较少。
c语言中const修饰的全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。const修饰的局部变量存储在栈中,代码块结束时释放。
c语言中可以通过指针对const局部变量进行修改,而不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段。(可以参考下面的例子,图2)
注意:他只是不能显式的修改,可以通过一定的方法隐式的去修改const修饰的变量。
const在修饰指针变量时的基本用法如下:
const char *p ="helloword";
char const *p ="heklloword"; //两者表达的意思一样 表示常量字符串
char * const p; //表示指向的地址不能变,内容却可以刷新,比如LCD的Framebuffer
const char * const p; //表示指向的地址不能边,内容也不能变,比如 ROM设备
如何隐式的去改变const修饰的变量:
#include <stdio.h>
int main()
{
const int a =0x1234;
int b =0x1122;
char *p =&b;
*(p+1)= 100; // p[1]=100; //两种皆可,通过这种方法可改变a的值 指针操作
return 0;
}
//或者用数组的方法也可以
int main()
{
char buf[4];
const int a =0;
buf[4]=4; //数组越界访问,改变a的值
return0;
}
这种用法不常见,知道就可以了,可以不掌握,用作常量比较多,如果有较大的数组可以定义为const全局数组,这样可以节省堆栈空间,在嵌入式的开发中节约资源很重要。