zoukankan      html  css  js  c++  java
  • Linux C/C++——const

    1.定义

      在C/C++中,const通常被用来声明一个变量为常量,用法:const int a = 100,但在C和C++中,const还是有些区别。

    2.在C语言中

    ①C语言中const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。

    #include <stdio.h>
    void
    test01() { const int a = 100; //const修饰的局部变量是放在栈区的,不能直接被修改,但可以通过地址修改 int *p = &a; *p = 10; printf("%d ",a); } int main(int argc, char const *argv[]) { test01(); return 0; }

    从上面的运行结果我们可以看到,在C语言中const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。

    ②如果const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。

    #include<stdio.h>
    const int b = 100;//const修饰的全局变量不能被修改
    void test02()
    {
        int *p = &b;
        *p = 10;
        printf("%d
    ",b);
    }
    
    int main(int argc, char const *argv[])
    {
        test02();
        return 0;
    }

    但在C语言中,如果const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。

    ③如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。

    const_in_c.c主程序

    #include<stdio.h>
    extern const int num;
    void test03()
    {
        printf("%d
    ",num);
    }
    
    int main(int argc, char const *argv[])
    {
        test03();
        return 0;
    }

    c_test.c这个程序的num变量,被主程序调用

    const int num = 12;

    再写一个Makefile,编译上面两个程序

    const:const_in_c.o c_test.o
        gcc -o const const_in_c.o c_test.o
    const_in_c.o:const_in_c.c
        gcc -c const_in_c.c
    c_test.o:c_test.c
        gcc -c c_test.c

    运行结果

    如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。

    3.在C++中

    ①在C++中,const修饰的局部变量放在符号表中,不管直接还是通过地址都是无法修改它的值的。

    #include<iostream>
    using namespace std;
    void test01()
    {
        const int a = 100;
        int *p = (int *)&a;
        *p = 10;
        printf("%d
    ",a);
    }
    int main(int argc, const char** argv) {
        test01();
        return 0;
    }

    运行结果我们可以看出,会报错,所以是无法修改的。

    ②const修饰的全局变量放在常量区,它的值无法被修改。

    #include<iostream>
    using namespace std;
    const int  b = 100;
    void test02()
    {
        int *p = (int *)&b;
        *p = 10;
        printf("%d
    ",b);
    }
    int main(int argc, const char** argv) {
        test02();
        return 0;
    }

    也同样是发生错误,因为C++中const修饰的全局变量的值是无法被修改的。

    ③const修饰的变量默认是内部链接属性,用extern修饰可以将其改成外部链接属性。

     const_in_c++.cpp

    #include <iostream>
    using namespace std;
    extern const int num;
    void test03()
    {
        printf("%d
    ",num);
    }
    int main(int argc, const char** argv) {
        test03();
        return 0;
    }

    c++test.cpp

    extern const int num = 99;

    运行结果

    3.总结一下

    在C语言中:

    ①const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。

    ②const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。

    ③如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。

    在C++中:

    ①在C++中,const修饰的局部变量放在符号表中,不管直接还是通过地址都是无法修改它的值的。

    ②const修饰的全局变量放在常量区,它的值无法被修改。

    ③const修饰的变量默认是内部链接属性,用extern修饰可以将其改成外部链接属性。

  • 相关阅读:
    sas中的sql(8)sql选项解析,数据字典
    sas中的sql(7)创建视图,更新视图,删除视图
    sas中的sql(6)创建表格、展现表格、插入行、删除行、规定限制条件(constriants)、处理输入错误(undo策略)、update表格、更改列
    sas中的sql(5) 纵向操作数据集 Except、Intersect、Union、OuterUnion
    sas中的sql(3) 标签,格式化输出,关联与非关联子查询子查询,大于两张表的联合查询(暂缺)
    iOS系统的沙盒机制
    Objective-C中一种消息处理方法performSelector
    IOS开发之关键字category详解
    IOS开发之百度地图API应用
    用法总结:viewDidLoad/viewDidUnload, loadView
  • 原文地址:https://www.cnblogs.com/953-zjf/p/const.html
Copyright © 2011-2022 走看看