C语言深度剖析---const关键字(转载)

 const是constant的缩写,是恒定不变的意思。被const修饰的值,是只读变量。

1、const修饰只读变量,具有不变性
      #include <stdio.h>

     int main()
    {
       const int Max = 100;
       int Array[Max];
    
          return 1;
    }

     在VC6.0中创建该文件,编译器会报错。因为我们定义数组必须指定其元素的个数,这也从侧面证实C语言中,const修饰的Max仍然是一个变量,只不过是只读属性罢了。
     const修饰的只读变量必须在定义的同时初始化。

2、节省空间,避免不必要的内存分配,同时提高效率
    const推出的初始目的,是为了取代预编译指令,消除它的缺点,同时继承他的优点。可以看下它和define的区别:
    编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使它成为一个编译期间的值,没有了存储于读内存的操作,使得它的效率也提高

  #include <stdio.h>

  #define M 3               //宏常量
    
     const int N = 5;          //此时并未将N放入内存中
     int main()
   {
       int i = N;                  //此时为N分配内存 ,以后不再分配
       int I = M;                 //预编译期间进行宏替换,分配内存
          int j = N;                  //没有内存分配
          int J = M;                  //在进行宏替换,又一次分配内存
   }

 const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份备份(因为它是全局的只读变量,放在静态   区),而#define定义的宏常量在内存中有若干个备份。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。

3、const修饰变量

C语言深度剖析---const关键字 - engineerdream - engineerdream
    先忽略类型名(编译器解析的时候也是先忽略类型名),我们看const离哪个近,“近水楼台先得月”,离谁近就修饰谁。
 
4、const修饰函数的参数
 const修饰符可以修饰函数的参数,当不希望这个参数值在函数体内被意外改变时使用const void fun(const int i)
 告诉编译器i在函数体内不能被改变,从而防止了使用者的一些无意的或者错误的修改

5、
修饰函数的返回值
  const修饰符也可以修饰函数的返回值,返回值不可被改变

6、在另一链接文件中引用const只读变量 
   
extern const int i   ; 
原文地址:https://www.cnblogs.com/NewZealand/p/3414625.html