const 数组 & 作用域

来源:互联网 发布:707的医药软件 编辑:程序博客网 时间:2024/06/06 17:46

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只是表示变量只读,不能出现在赋值符号左边,防止被意外修改,并且编译器一定会优化,不会每次去内存取值。这时候如果外部事件(如中断服务程序)改变了这个变量的内存值,那么编译器优化就不会又反应,导致错误