- 用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量,又称常变量。这也就意味着必须在定义的时候就给它赋初值。
如果定义的时候未初始化,我们知道,对于未初始化的局部变量,程序在执行的时候会自动把一个很小的负数存放进去。这样后面再给它赋初值的话就是“改变它的值”了,即发生语法错误。
- 用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。
- 全局变量的生存周期为程序运行的整个过程这个是理所当然的。
- 而使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程。
- 我们知道全局变量是静态的,静态的生存周期就是程序运行的整个过程。但是用const修饰过的局部变量只是有了静态特性,并没有说它变成了静态变量。
局部变量存储在栈中,
静态变量存储在静态存储区中,
const修饰后的全局变量保存在只读数据段中,修饰的局部变量仍然保存在栈中。
而经过 const 修饰过的全局变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。
全局变量,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。
而const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。
-
用于指针
-
const int *p; int const *p; //含义是指向常量的指针,指针的常量值不可以修改两者相同,p是一个指向整形常变量的指针,可以修改指针的值,但不能修改指针所指向的值。例如:
int b = 5; int c = 3; const int *p=&b; *p=6; //错误,不能通过指针修改所指向的值; p=&c; //正确,可以修改指针的值 -
常量指针
int *const p; //含义是常量指针,p的值不可以修改 -
用于函数
void foo(const int *p)const用于形参时说明了形参在函数内部不会被改变。这种形式通常用于数组形式的参数中模拟传值调用。这也是const最有用之处,限定函数的形参,这样该函数将不会修改实参指针所指向的数据。这里需要注意得的是,是函数不应该去修改而不是不能修改,因为有方法绕过这个限制,例如可以在函数体内重命名一个指针 char *p2 = p ; 即可改动 p 所指的数值。

2654

被折叠的 条评论
为什么被折叠?



