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的使用只是提供给别人一种信息,这个值不能改变(形参),这是一个有用的信息,不论是好的方面还是另外的方面。
阅读(1674) | 评论(0) | 转发(0) |