• c++里的const


    一、三种用法
    1.const int *p; //锁定指针指向内存空间值
    eg:
    int a=10,b=5;
    const int *p;
    p=&a;
    *p=20; //编译错误原因:指针指向内存空间值为定值
    结果:1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值


    2.int * const p; //锁定指针值(即指针的指向不能改变)
    eg:
    int a=10,b=5;
    int *const p=&a; //注意:指针值为定值时需要给指针赋初值
    p=b; //编译错误原因:指针值为定值
    结果:1>e:程序 est est源.cpp(7): error C3892: “p”: 不能给常量赋值

    3.const int *const p; //既锁定指针值,又锁定指针指向内存空间值
    eg:
    int a=10,b=5;
    const int *const p=&a;
    p=&b; //编译错误原因:指针值为定值
    *p=20; //编译错误原因:指针指向内存空间值为定值
    结果: 1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值
    1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值

    二、c与c++中const的不同(c是冒牌货)
    c里的const定义常量可以通过指针指向改变指针指向空间的值
    c++里的const定义常量被放在符号区,当有指针指向时会在内存重新划分空间并复制。原变量不改变,但可以改变指针指向空间值
    eg:
    c编译器里
    #include <iostream>
    using namespace std;
    void main()
    {
    const int a=10;
    int *p=&a;
    *p=20;
    cout<<a<<endl;
    system("pause");
    }
    运行结果为20(此时输出指针值也为20,指针与变量代表同一块内存空间)
    c++编译器里
    #include <iostream>
    using namespace std;
    void main()
    {
    const int a=10;
    int *p=(int *)&a;
    *p=20;
    cout<<a<<endl;
    system("pause");
    }
    运行结果为10;(此时输出指针值为10,指针指向的空间是后来复制在内存空间的,此时变量值储存在符号区,是个定值)
    结论:c里的const可以通过指针修改变量值,是冒牌货,c++里不行.

    三、const与#define的不同
    #define在预编译阶段就执行,是简单的文本替换,作用域是整个文件,可在后面取消文本替换(即缩小作用域):用undef结束文本替换
    const定义变量在编译阶段开始执行内存划分,作用域一般为变量作用域。
    eg:
    #include <iostream>
    using namespace std;
    void f1();void f2();
    void main()
    {
    f2();
    system("pause");
    }
    void f1()
    {
    #define a 10
    const int b=20;
    }
    void f2()
    {
    cout<<a<<endl;
    cout<<b<<endl; //编译错误原因:此时b的作用域只在函数f1里,a的作用域是整个文件
    }
    结果:error C2065: “b”: 未声明的标识符

    问题:此时如何缩小a的作用域?
    void f1()
    {
    #define a 10
    const int b=20;
    #undef a; //取消a的预编译文本替换即可
    }

  • 相关阅读:
    Codeforces 1354C2
    Codeforces 1354C1
    Codeforces 1355C
    Codeforces 1353D
    Codeforces 1352
    Codeforces 1351C
    Codeforces 1344B/1345D
    Codeforces 1342D
    Codeforces 1340B/1341D
    Codeforces 1343D
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236361.html
Copyright © 2020-2023  润新知