免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2297 | 回复: 9
打印 上一主题 下一主题

const 赋值 ,麻烦看下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-31 11:27 |只看该作者 |倒序浏览
int main()
{
        int i=0;
        const int *n;
        int o=5;
        int a[5]={1,2,3,4,5};
//      a[0]=i;

        int b[3]={1,2,3};
        int *const l=b;
//1.赋值

        const int p=o;
        const int * const q=a ;
        n=&o;
        b[0]++;
        o++;
//1.end

                printf("int %d ---const * %d ---const %d ---* const %d\n",o,*n,p,*l);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5;i++,a[0]=i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("i=%d--- %d ---- %o\n",i,*(q),q);
}


输出结果为
int 6 ---const * 6 ---const 5 ---* const 2
i=0--- 1 ---- 27757561724 //注意这里是1
i=1--- 1 ---- 27757561724
i=2--- 2 ---- 27757561724
i=3--- 3 ---- 27757561724
i=4--- 4 ---- 27757561724


把a[0]=i;的注释去掉,则输出结果变为
int 6 ---const * 6 ---const 5 ---* const 2
i=0--- 0 ---- 27755555504 //这里变成了0
i=1--- 1 ---- 27755555504
i=2--- 2 ---- 27755555504
i=3--- 3 ---- 27755555504
i=4--- 4 ---- 27755555504


这说明const 只在预定义的时候初始化了一次,后面的忽略了一次,为什么这样自设计?

论坛徽章:
0
2 [报告]
发表于 2009-05-31 11:38 |只看该作者

??

不懂你写这样的代码是为了表达什么

在C里面有这个漏洞,虽然可以定义const,但实际上还是可以通过取得内存地址然后修改地址中的值来改变常量的值,在C++中这是不允许的

论坛徽章:
0
3 [报告]
发表于 2009-05-31 12:19 |只看该作者
只是 偷懒把所有代码都拷过来了, 想说的是注释那条语句“a[0]=i;”可以影响到const 值
        int a[5]={1,2,3,4,5};
//      a[0]=i;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const int * const q=a ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<5;i++,a[0]=i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("i=%d--- %d ---- %o\n",i,*(q),q);


但是for循环里的“a[0]=i;” 第一次却没有影响到

[ 本帖最后由 wroxman 于 2009-5-31 12:25 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-05-31 13:16 |只看该作者
const 只在预定义的时候初始化了一次,后面的不能初始化,就是为了不让别的语句能修改它

论坛徽章:
0
5 [报告]
发表于 2009-05-31 13:46 |只看该作者

回复 #4 notion001 的帖子

但是后面又变掉了 , 本来开始是1  后面改成2、3、4了 ,为什么0 不能赋过去?

论坛徽章:
0
6 [报告]
发表于 2009-05-31 14:00 |只看该作者
楼主先研究一下for循环的执行顺序

论坛徽章:
0
7 [报告]
发表于 2009-05-31 14:09 |只看该作者
原帖由 baicj 于 2009-5-31 14:00 发表
楼主先研究一下for循环的执行顺序

麻烦说清楚一点吧  谢谢啦

论坛徽章:
0
8 [报告]
发表于 2009-05-31 14:09 |只看该作者
注释a[0] = i的时候,实际上:
a[5]={1,2,3,4,5};
第一次循环的时候只会初始化和进行条件判断,不会执行a[0] = i
for(i=0;i<5;i++,a[0]=i)
                printf("i=%d--- %d ---- %o\n",i,*(q),q);
所以第一次a[0]的值仍然为1

去掉注释了的话实际上此时:
a[5]={0,2,3,4,5};

注意:const int * const q=a  ; //a指向的地址不能变,但是*q是能变的

在c中const常量的值是可以通过指针来改变的,比如说 :
const int a = 10 ;
int * b = &a ;
*b  = 20 ;
则此时a的值为20

论坛徽章:
0
9 [报告]
发表于 2009-05-31 14:13 |只看该作者
  谢啦 还以为是const 的问题呢

论坛徽章:
0
10 [报告]
发表于 2009-05-31 15:10 |只看该作者
for 执行流程都可以搞错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP