const 数组 & 作用域

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值