Chinaunix首页 | 论坛 | 博客
  • 博客访问: 835781
  • 博文数量: 90
  • 博客积分: 766
  • 博客等级: 军士长
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-18 08:42
个人简介

linux

文章分类

全部博文(90)

文章存档

2021年(2)

2020年(2)

2017年(1)

2015年(11)

2014年(1)

2013年(53)

2012年(16)

2011年(4)

分类: C/C++

2011-12-29 14:19:32

    const在C语言当中声明一个变量为只读,但它并未声明它的地址也为const,这意味着它的地址可以赋给一个普通的指针,然后通过修改这个普通的指针来改变这个变量如:
const int i = 10;
int *j = NULL;
j = &i;
*j = 20;这种改变得益于并未声明地址为const,因为在ANCI中规定赋值左右的表达示的限定符一定不少于右边的,如果指针为const那么就不能将指针赋给普通指针了。
     可见const并没有考虑到间接引用的情况,并不会对间接引用进行检查,另外*&i = 20;这样做并不成功,说明也许*&并不是间接引用,这是一种合理的解释;另外还有一种可能改变const变量的值的方法,采用内联汇编:
__asm__ __volatile
("movl %1,%0":"=r"(input),"m"(output)):将output的值放入到input当中去;
原以为这种方法可以,但非常遗憾失败了,有个学长告诉我,汇编可以跳出C语言的限定符,也许他是错的,也许是内联汇编并没有做到跳出C语言限定符的限定,但只是内联汇编而已,也许另外还有非内联的方式,这种__asm__方式编译器还需要做些翻译工作,并没有实现完整的汇编。
      能够得到一个结论-间接引用可以修改const的值,也许const的使用只是提供给别人一种信息,这个值不能改变(形参),这是一个有用的信息,不论是好的方面还是另外的方面。
 
阅读(1634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~