const & volatile

一、const

(1)const修饰变量

1)在C语言中const修饰的变量是只读的,其本质还是变量;

2)const修饰的变量会在内存占用空间;

3)本质上const只对编译器有用,在运行时无用(const不是真的常量)。


    const int c = 1;//只读的变量c
    int *p = (int*)&c;//取地址,改变地址值

    printf("%d\n", c);

    //c = 2;只能为左值
    *p = 3;

    printf("%d\n", *p);
(2)const修饰数组

在C语言中的const修饰的数组是只读的,空间不可被改变

    const int arr[5] = {1,2,3,4,5};
    int *p = (int*)arr;
    int i = 0;

    for(i = 0; i < 5; i++)
    {
        printf("%d ",arr[i]);
    }

    for(i = 0; i < 5; i++)
    {
        p[i] = 5 - i;
    }
    printf("\n");
    for(i = 0; i < 5; i++)
    {
        printf("%d ", p[i]);
    }
(3)const修饰指针

1)const int* p; p可变(p指向的地址值可变) p指向的内容不可变

2)int const* p; p可变(p指向的地址值可变) p指向的内容不可变

3)int* const p;p不可变 p指向的内容可变

4)const int * const p;都不可变

(4)const修饰函数参数和返回值

1)const修饰函数参数表示在函数体内不希望改变函数的参数值;

2)const修饰函数返回值表示返回值不可改变,多用于返回指针的情形;

    const int* fun()
   {
     static int count  = 0;
     count ++;
     return &count;
   }
二、volatile

(1)volatile可理解为“编译器警告指示字”;
(2)volatile用于告诉编译器必须每次去内存中取变量值;

(3)volatile主要修饰可能被多个线程访问的变量;

(4)volatile也可以修饰可能被未知因数更改的变量。 

    int obj = 10;
    int a = 0;
    int b = 0;
    
    a = obj;
    
    sleep(100);
    
    b = obj;
以上代码:编译器在编译时发现obj没有被当成左值使用 因此会直接将obj替换成10,而把a b都赋值为10

在sleep(100)期间 若有硬件中断 而在此中断中 我们想要得到的值为中断后b的值 而此时 b的值仍为10

使用volatile,编译器从内存中每次取值,不会做任何优化。


全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务