C语言 const

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

const只读变量

  • const修饰的变量是只读的,本质还是变量
  • const修饰的局部变量在上分配空间
  • const修饰的全局变量在只读存储区分配空间
  • const只在编译期有用,在运行期无用

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

const修饰全局变量

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

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

示例:const变量的本质

#include <stdio.h>

const int g_cc = 2;

int main()
{
    const 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;

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

    return 0;
}

运行结果:

const变量的本质

可以看出

  • const修饰的局部变量的值被改变了。
  • const修饰的全局变量,被存放在只读存储区,修改其值时发生了segmentation fault。

上面的代码,如果用bcc 编译器编译,运行后不会报错:

const变量的本质

原因是bcc编译器是比较早期支持标准C规范的编译器,没有做任何的扩展和优化,const修饰的全局变量跟普通的全局变量没有任何区别,并没有编译存储于只读存储区。

const的本质

C 语言中的const 使得变量具有只读属性。

现代 C 编译器中的const 将具有全局生命周期(全局变量、static 局部变量)的变量存储于只读存储区。

示例: const的本质分析

#include <stdio.h>

const int g_array[5] = {0};

void modify(int* p, int v)
{
    *p = v;
}

int main()
{
    int const i = 0;
    const static int j = 0;
    int const array[5] = {0};

    modify((int*)&i, 1);           // ok
    modify((int*)&j, 2);           // error, j被存放于只读存储区,不能被修改
    modify((int*)&array[0], 3);    // ok
    modify((int*)&g_array[0], 4);  // error,g_array被存放于只读存储区,不能被修改

    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 0;
}

运行结果:

const的本质分析

const修饰函数参数和返回值

const修饰函数参数表示在函数体内不希望改变参数的值,const修饰函数返回值表示返回值不可改变,多用于返回指针的情况。

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

#include<stdio.h>

int main(){
    const char *s = "www.deepinout.com";//字符串字面量
    return 0;
}

示例:const 修饰函数参数和返回值

#include <stdio.h>

const char* f(const int i)
{
    i = 5; //error, i被const修饰,在函数体内部不能被改变,不能成为左值

    return "deepinout.com";
}

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

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

    pc[9] = '_';// f函数返回的只读存储区的内容,这里修改会报错

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

    return 0;
}

gcc编译结果:

const 修饰函数参数和返回值

const总结

  • const使得变量具有只读属性
  • const不能定义真正意义上的常量
  • const将具有全局生命周期的变量存储于只读存储区

const总结

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C语言教程