const的定义

const的故事

定义:

const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

const三连:

const修饰的变量表示只读,不可以直接修改(但可以通过其它方式修改)
const修饰的局部变量保存在栈区 可以通过指针修改内存区域的值
const修饰的全局变量保存在代码区 如果直接修改编译报错 如果通过指针修改 段错误

常量
const int a = 10;//全局
使用a和使用10没有区别

#include 
const int x = 100;//保存在代码区 不能修改  ,也不能通过指针修改
int y = 0;
int main(){
printf("%p\n",&x);
printf("%p\n",&y);
int a = 10;
const int b = 10;
printf("%d\n",b);
printf("%p\n",&b);
//b = 100;//不能直接修改
//修改的方式
int *p = &b;
*p = 111;
printf("%d\n",b);
p = &x;
//*p = 119;
printf("%d\n",x);
return 0;	
}


主要作用

(1)可以定义const常量,具有不可变性。
   例如:const int Max=100; Max++会产生错误;
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
   例如: void f(const int i) { …} 编译器就会知道i是一个常量,不允许修改;
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
   如(1)中,如果想修改Max的内容,只需要它修改成:const int Max=you want;即可!

(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错;
   例如: void f(const int i) { i=10;//error! }
(5) 可以节省空间,避免不必要的内存分配。 例如:
   #define PI 3.14159 //常量宏
   const double Pi=3.14159; //此时并未将Pi放入ROM中 …
   double i=Pi; //此时为Pi分配内存,以后不再分配!
   double I=PI; //编译期间进行宏替换,分配内存
   double j=Pi; //没有内存分配
   double J=PI; //再进行宏替换,又一次分配内存!
   const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。
(6) 提高了效率。
  编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

const为您避障:

const int p; //p是一个长整型数
int const p;//p是一个长整型数
const char *p;  // p是一个指向常字符的指针				 
//const修饰*p   *p只读     p本身的值可以修改
char const *p;   //p是一个常量指针
//等同于  const char *p;

char * const p;  //p是一个指向字符的常指针
//const修饰p    p只读     *p的内容可以修改

const char * const p;	//p是一个指向常量字符的常指针
//p 和 *p 都是只读    

你可能感兴趣的:(标准C语言学习,const)