const关键字

const为constant的缩写,是恒定不变的意思。被const修饰的值,是只读变量
1.const修饰只读变量,具有不变性
      #include <stdio.h>

       int main()
      {
            const int Max = 100;
            Max = 10;
              return 1;
       }

     const修饰的只读变量必须在定义的同时初始化,同时之后不能修改。在Linux下将报错“error: assignment of read-only variable “Max”

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修饰变量

 

const char *str;  //const修饰*str,意味着不能通过指针str改变其指向的对象

 

char  * const str; //const修饰 str,意味着指针str不能够改变

 

const char * const str; //第一个const修饰*str,意味着不能通过指针str改变其指向的对象;第二个 const修饰str,意味着指针str不能够改变

 


const离哪个近,就修饰谁。
 
4.const修饰函数的参数
const修饰函数的参数,当不希望这个参数值在函数体内被意外改变时使用:const void fun(const int run)
 告诉编译器run在函数体内不能被改变,从而防止了使用者的一些无意的或者错误的修改

 
5.修饰函数的返回值
1)如以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数:
   const char * GetString(void);
   如下语句将出现编译错误:
   char *str = GetString();
   正确的用法是
   const char *str = GetString();
2)如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
例如不要把函数char GetString(void) 写成constchar GetString(void) 
同理不要把函数A GetString(void) 写成const A GetString(void),其中A 为用户自定义的数据类型。
 
 
 
 
 
原文地址:https://www.cnblogs.com/xiaoxing/p/3955475.html