| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 745 人关注过本帖
标题:const问题
只看楼主 加入收藏
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
结帖率:94.12%
收藏
已结贴  问题点数:10 回复次数:9 
const问题
#include <stdio.h>

int main()
{

    const int a = 10;//a的值应该是不可改写的吧?
    int * b = &a;
    (*b)++;
    printf("%d\n",a);
}
为什么最后编译通过(产生一条警告信息),执行还是会改变a的值呢?
搜索更多相关主题的帖子: const 
2010-10-13 08:26
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
我也不怎么清楚,楼主你看过c++吗?在c中我没用过const啊!
求解。
2010-10-13 08:43
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:2 
这个a是可以改的,

#include <stdio.h>
int main(void)
{
   
    const int a = 10;//a的值应该是不可改写的吧?

    ((unsigned char *)&a)[0] = 11;

    printf("%d\n",a);
    getchar();

    return 0;
}
这样改就没警告了,

[ 本帖最后由 BlueGuy 于 2010-10-13 09:16 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-10-13 09:03
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:1 
程序代码:
#include<stdio.h>
#include<malloc.h>
int main()
{
    volatile const int a=0;
    int b[1];
    b[1]=1;
    printf("%d\n",a);
    return 0;
}
2010-10-13 09:22
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
以下是引用BlueGuy在2010-10-13 09:03:49的发言:

这个a是可以改的,

#include
int main(void)
{
   
    const int a = 10;//a的值应该是不可改写的吧?

    ((unsigned char *)&a)[0] = 11;

    printf("%d\n",a);
    getchar();

    return 0;
}
这样改就没警告了,
为什么a的值可改啊,const int a 定义的变量值不是不会被更改的吗?
2010-10-13 10:24
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:2 
一、const 只是指明后面的变量初始化后不能被赋值。这只是编译时刻的限制。也就是说,
a基本上是一个普通的变量,只是compiler在检查你的代码有没有对它赋值。
二、
1) const int a;
2) int const a;
3) const int *a;
4) int * const a;
5) int const * const a;

1,2------的作用是一样,a是一个常整型数。
3--------意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
4--------意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
5--------最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

这些都是查到的信息

帮人《---》帮己
2010-10-13 15:26
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
以下是引用逐渐学习在2010-10-13 15:26:20的发言:

一、const 只是指明后面的变量初始化后不能被赋值。这只是编译时刻的限制。也就是说,
a基本上是一个普通的变量,只是compiler在检查你的代码有没有对它赋值。
二、
1) const int a;
2) int const a;
3) const int *a;
4) int * const a;
5) int const * const a;

1,2------的作用是一样,a是一个常整型数。
3--------意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
4--------意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
5--------最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

这些都是查到的信息
初始化后不能被赋值,也就是说不能用a++ 、a= 类似的赋值,但通过地址改变其值是可以的?
2010-10-13 15:49
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:0 
可在vc6下编译你的代码,是按error提示的,而且不让运行的。
initializing' : cannot convert from 'const int *' to 'int *'
Conversion loses qualifiers。
所以通过地址改变,编译是不允许的。

帮人《---》帮己
2010-10-13 16:35
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
回复 8楼 逐渐学习
我用vc++的是可以的,那就是可能是编译器的问题了。
2010-10-14 11:02
cacker
该用户已被删除
收藏
得分:5 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-14 13:06
快速回复:const问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022599 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved