搜索
查看: 543|回复: 8
打印 上一主题 下一主题

[原创] cpc__const常量的值到底能不能修改

[复制链接]
跳转到指定楼层
楼主
发表于 2018-3-3 19:43:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【提示:本文含有“不太绕的”指针内容】
【注意:在全部看完前不要真的去试】
    我们知道,可以用[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:57 | 只看该作者
有意见请慢慢谈,辱骂粗话不欢迎。
如果本文有错误,欢迎大家提意见。

点评

一直打不开换头像的设置  发表于 2018-3-4 11:53
http://blog.csdn.net/jq_ak47/article/details/53152849  发表于 2018-3-4 09:48
你终于换头像了!!!  发表于 2018-3-3 19:57
我曾发过一句押韵的打油诗:窗口从哪来?还等你来改。  发表于 2018-3-3 19:49
太差了,一点也不押韵。  发表于 2018-3-3 19:46
板凳
发表于 2018-3-4 12:33:59 | 只看该作者
试图修改一个const的值的行为是未定义的
                                       

点评

嗯,确实,所以不建议钻编译器的空子  发表于 2018-3-6 16:43
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表