啊哈磊_编程从这里起步

标题: cpc__const常量的值到底能不能修改 [打印本页]

作者: 赵林    时间: 2018-3-3 19:43
标题: cpc__const常量的值到底能不能修改
【提示:本文含有“不太绕的”指针内容】
【注意:在全部看完前不要真的去试】
    我们知道,可以用[mw_shl_code=c,false]const int a=3;[/mw_shl_code]来定义一个整型常量。而这时使用诸如“a=3”、“a++”这类语句是不行的。那么,常量的值到底能不能修改?
    我们还得从指针说起。下面有这样三条声明:[mw_shl_code=c,false]int* p1;
int const* p2;
const int* p3;[/mw_shl_code]其中:[mw_shl_code=c,false]指针p1的类型是int*,指向整型变量;
“常量指针”p2的类型是int const*,指向整型变量,p2的值不可以修改;
“指针常量”p3的类型是const int*,指向整型常量。[/mw_shl_code]p2指向普通的变量,但它自己的值不能修改,也就是说我让它指向a了,就不能再p2=&b;了。可以理解成“const是修饰*的”。p3呢?它本身可以修改,但只能指向常量(const int)。所以说“const是修饰int的”。

    为什么要有p3呢?一般的指针不行吗?
    先来看一段代码:[mw_shl_code=c,true]#include <stdio.h>
int main()
{
    const int a=3;
    int p=(int*)&a;
    (*p)=100;
    printf("%d",a);
    return 0;
}[/mw_shl_code]现在,a从3变为100了。
    因为我们先获取了a的地址,再把地址的值改为100,躲过了编译器的检查。
    运行一下,3!!!
    为什么?
    检验一下,把地址一起输出:[mw_shl_code=c,false]printf("%p %p",&a,p);[/mw_shl_code]62FE44 62FE44
    同一个地址不同数值!
    啊哈!原来是该死的编译器优化。
    文件名.cpp改成.c,成功了。[mw_shl_code=c,false]100[/mw_shl_code]
    现在,可以回答为什么用const int*了:这样,可以确保*p=100;通不过编译。
【本文不建议使用如此方法修改常量的值,只是强调:常量就是“常变量”,运行时和变量没有任何区别,只是编译时禁止了类似赋值的操作。】
对了,还有一点:注意编译器优化!

作者: 赵林    时间: 2018-3-3 19:45
有意见请慢慢谈,辱骂粗话不欢迎。
如果本文有错误,欢迎大家提意见。
作者: 初学C    时间: 2018-3-4 12:33
试图修改一个const的值的行为是未定义的
                                       




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2