zoukankan      html  css  js  c++  java
  • 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 为用户自定义的数据类型。
     
     
     
     
     
  • 相关阅读:
    学习:恢复被孤立的数据库dbo (转)
    学习:SharePoint编程提升权限的方法(转)
    SQL行列互换
    前台用js、jquery出现错误很多是由于IE缓存
    关于dialog首次加载的时候隐藏的一个问题
    要取某个对象的值,先要判断对象是否为空的简便写法(记)
    写js或者jquery的时候最重要的调试,再也不用alert弹出对象
    嵌入式软件测试的十大秘诀
    SIMULINK sfunction的设计
    关于java解压zip与rar的问题
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/3955475.html
Copyright © 2011-2022 走看看