C语言查漏补缺——const-创新互联

一、const的作用
const修饰的变量,变成了一个不可修改的常量,比如
int c = 0;这个时候,c是可以修改的,但是加上const以后,c的值就变成常量,
const int c = 0; 如果这个时候令c = 2;那么程序就会报错。
这就是const的主要作用,但是,在C语言中,const修饰的变量真的就是一个常量吗?

成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的太原网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

二、const的"bug"
我们看下面这段代码

int main()
{
    const int cim_test = 1;

    printf("cim_test = %d\n", cim_test);

    int *p1 = &cim_test;

    *p1 = 3;
    printf("cim_test = %d\n", cim_test);

    return 0;
}
这段代码,运行结果如下

C语言查漏补缺——const
不是说好的const修饰的变量是一个常量吗?常量是什么,就是初始化以后,直到程序结束,值都不会改变的量。为什么这里被改变了呢?

三、const的几种情况
在回答上面的问题之前,我们先考虑const会出现的几种情况,
1、const修饰static局部变量
2、const修饰全局变量
3、const修饰局部变量

第一种情况,这个时候的局部变量受到static的影响更大,因此,存储在只读存储区上,无法进行修改。
第二种情况,这个时候的就要看编译器了,如果是早期的编译器,比如BCC这种的话,变量是存储在全局数据区,而如果先一些现代c编译器的话,那么,编译器会优化,将其存储于只读存储区。
第三种情况,这是比较常见的,这种时候,变量是存储在栈上的,因此,我们可以通过指针指向这段内存,然后修改这个值

因此,得出结论====>在C语言中,const修饰的变量,并不完全是常量。

下面是测试代码

#include 

const int cig_test = 2;

int main()
{
    const int cim_test = 1;
    const static int cism_test = 3;

    printf("cim_test = %d\n", cim_test);

    int *p1 = &cim_test;

    *p1 = 3;
    printf("cim_test = %d\n", cim_test);

    int *p2 = &cig_test;
    *p2 = 4;       //不确定,需要知道编译器是现代编译器,还是古老的标志编译器
    printf("cig_test = %d\n", cig_test);

    int *p3 = &cism_test;
    *p3 = 5;      //报错,加上static修饰的变量,存储在只读存储区
    printf("cism_test = %d\n", cism_test);

    return 0;
}

四、const的扩展
我们可以利用const的这个属性来规范一些代码编写。
1、const修饰的函数参数,在函数内部不允许修改。
2、const修饰的函数返回值,表示函数的返回值不可以修改
#include

const char* f(const int i)  
{  
    i = 5;    //error,const变量不能作为左值  

    return "Hello World";    //返回指向只读存储区的指针  
}  

int main()  
{  
    char* pc = f(0); //waring  

    printf("%s\n", pc);  

    pc[6] = '_';    //error,不能修改只读存储区的内容  

    printf("%s\n", pc);  

    return 0;  
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章标题:C语言查漏补缺——const-创新互联
路径分享:http://hbruida.cn/article/ddhpep.html