标签:指针 语言 代码 执行 第一个 运行 include 环境 位置
#include <stdio.h> void main() { const int *p; //p本身不是const,而p指向的变量是const int const *p; //p本身不是const,而p指向的变量是const int* const p; //p本身是const,而p指向的变量不是const const int* const p; //p本身是const,而p指向的变量也是const }
const修饰的变量真的不能改吗?
(1)代码练习说明:const修饰的变量其实是可以改的(前提是gcc环境下)。
#include <stdio.h> void main() { const int a = 5; int* p; p = (int *)&a; //这里的报警可以用强制类型转换来消除 *p = 6; printf("a = %d\n",a); }
(2)在某些单片机环境下,const修饰的变量是不可以改的。const修饰的变量到底能不能真的被修改,取决于具体的环境,C语言本身并没有完全严格一致的要求。
(3)在gcc中,const是通过编译器在编译的时候执行检查来确保实现的(也就是说const类型的变量不能改是编译错误,不是运行时错误。)所以我们只要想办法骗过编译器,就可以修改const定义的常量,而运行时不会报错。
(4)更深入一层的原因,是因为gcc把const类型的常量也放在了data段,其实和普通的全局变量放在data段是一样实现的,只是通过编译器认定这个变量是const的,运行时并没有标记const标志,所以只要骗过编译器就可以修改了。
const究竟应该怎么用
(1)const是在编译器中实现的,编译时检查,并非不能骗过。所以在c语言中使用const,就好象是一种道德约束而非法律约束,所以大家使用const时更多是传递一种信息,就是告诉编译器、也告诉读程序的人,这个变量是不应该也不必被修改的。
标签:指针 语言 代码 执行 第一个 运行 include 环境 位置
原文地址:https://www.cnblogs.com/sanshijvshi/p/10279612.html