const int a[10] = {1,2,3,4,5};
int i =0;
for(i = 0; i < 5; i++)
a[i] = a[i] +1; // 数组a里面内容不能能修改
但若用指针指向数组地址
int *p = a ;
for(i = 0; i < 5; i++)
p[i] = p[i] +1; // 可以修改
这是因为const是对编译器来说的,如果你能骗过编译器,干什么都行
const就是一个挂羊头卖猪肉的伪君子“常量”
在C++里,private数据成员依然能通过指针访问 (类基址+相对偏移) 但用::运算符不行
const int a = 3;
a = 4; //不能直接赋值
再看:
const int a = 3;
int *p = &a;
*p = 4; //可以赋值,走后门了咯
作用域
int main()
{
{
int a = 1; printf("%d\n",a); //输出 1
}
int a = 2;printf("%d\n",a); //输出2,而且编译器不会认为变量重定义而报错
}
每个变量只在其作用域内有效 { }
const和volatile 可以同时声明一个变量吗?
void f()
{
const int count = 5;
int i = 0;
for(i=0; i<count; i++)
{
sleep(500);
}
}
大家看一下 我们是不是可以确认 这个循环一定做5次呢?
现代编译器对于这个情况一定是5次 ,在编译的时候 编译器就觉得都是const的了 在这个函数中又不可能改变值了 直接用5代替了
const只是表示变量只读,不能出现在赋值符号左边,防止被意外修改,并且编译器一定会优化,不会每次去内存取值。这时候如果外部事件(如中断服务程序)改变了这个变量的内存值,那么编译器优化就不会又反应,导致错误