1) const修饰普通变量
int const a;//把a声明为一个整数,值不能修改。虽然此时未赋值,也不能再赋值,所以只能在声明的时候赋值,如int const a = 10;
const int a;//同上。
例子:const int a= 100;
char buffer[a];//这是错误的。因为a总是占用内存,C编译器不知道它在编译时候的值,不能把它看成一个编译时期的常量,a 只是一个不可改变的变量。这是和define定义常量时候的区别。如define PI 3.14;
12) #include <iostream>
using namespace std;
void main()
{
//const int a = 2;
int ival=2;
const int a = ival;
int *b = (int *)&a;
*b = 3;
//cout << ival<<endl;//2
cout << a <<endl;//3
cout << (*b) <<endl;//3
}
很多人都会觉得这里会有编译错误,既然a是不可改变值的,这里*b = 3;就会出现编译错误。其实不是这样的,运行结果是:
3
3
13)再看和上面类似的一段代码
#include <iostream>
using namespace std;
void main()
{
const int a = 2;
//int ival=2;
//const int a = ival;
int *b = (int *)&a;
*b = 3;
cout << a <<endl;//a在内存中的值是2,但是输出的时候,编译器对其优化了.如果改为volatile,表示易变的.输出结果应该是3 3
cout << (*b) <<endl;
}
它的运行结果是
2
3
14)最后看这样一个代码
#include <iostream>
using namespace std;
void main()
{
const int a = 2;
a=3;
cout << a <<endl;
//cout << (*b) <<endl;
}
这段代码才会出现编译错误,因为不能直接修改a的值。
类似的
以下程序会出错.
#include <iostream>
using namespace std;
const int a = 2;//全局变量,存储在内存中的数据区,受操作系统保护的内存,不可修改值.只读.
void main()
{
a=3;
cout << a <<endl;
//cout << (*b) <<endl;
}
从以上例子可以看出,其实a 的值不是不能改变,只是不能直接改变而已。
可是12)和13)的运行结果竟然是不同的,很奇怪其中的原因,希望得到高手的指点。
2)const用于指针
const int * a;//a是一个指向整型常量的指针。指针的指向可以变,但是指针指向的值不能变。
int const * a;//同上
int * const a;//a是一个常量指针。指针的指向不可以变,但可以修改指针指向的整型的值。
const int const * a;//指针的指向和指针指向的值都不能改变。
例如:int a = 5;
int b = 3;
const int * p = &b;
b = 1;//是错误的。因为指针指向的值不可以改变。
p = &a;//是正确的,因为指针的指向可以改变。