九.const 和volatile 分析

本文深入探讨了C语言中const和volatile关键字的使用及意义。解析了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 也可以修饰可能被未知因数更改的变量

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值