九.const 和volatile 分析

const 只读变量

const 修饰的变量是只读的,本质还是变量

const 修饰的局部变量在栈上分配空间

const 修饰的全局变量在全局数据区分配空间

const 只在编译期,在运行期无用

const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边

在现代c语言编译器中,修改const 全局变量将导致程序崩溃

注意:标准c语言编译器不会将const 修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变

#include <QCoreApplication>
 
const int g_cc  = 2;
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    int cc = 1;
 
    int *  p = (int *)&cc;
 
    printf("cc = %d\n",cc);
 
    *p = 3;
 
    printf("cc = %d\n",cc);
 
    p =(int*) &g_cc;
 
    printf("g_cc = %d\n",g_cc);
 
    *p = 4; //  崩溃 现在编译器修改const全局变量将导致程序崩溃
 
   printf("g_cc = %d\n", g_cc);
 
    printf("end\n");
 
    return a.exec();
}
 

例2:

#include <QCoreApplication>
#include <stdio.h>
 
const int g_array[5] = {0};
 
void modify(int *p, int v)
{
    *p = v;
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    int const i = 0;
 
    const static int j = 0;
 
    int const array[5] = {0};
 
    modify((int*)&i,1);
 
    modify((int*)&j,2);
 
    modify((int*)&array[0],3);
 
   modify((int*)&g_array[0],4); // 修改会报错, const全局变量会被编译进只读存储区
 
    printf("i =%d\n",i);
 
    printf("j = %d\n",j);
 
    printf("array[0] = %d\n",array[0]);
 
    printf("g_array[0] = %d\n",g_array[0]);
 
    return a.exec();
}
const 修饰函数参数和返回值

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

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

小贴士:

c语言中的字符串字面量存储于只读存储区中,在程序中需要使用const char * 指针

例三:

#include <QCoreApplication>
 
const char * f(const int i)
{
    // i = 5; // 不能修改只读变量
 
    return "jason good";
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    char * pc = f(0); // const char * 不能赋值为char *
 
    printf("%s\n",pc);
 
    pc[6] = '_'; 
 
    printf("%s\n",pc);
 
    return a.exec();
}
volatile

volatile 可理解为“”编译器警告指示字“

volatile 告诉编译器必须每次去内存中取变量值

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

”volatile 也可以修饰可能被未知因数更改的变量

发布了206 篇原创文章 · 获赞 18 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lvmengzou/article/details/104447032