NO5.变量的属性和存储位置

变量属性使用到的几个关键字

auto   static   register  extern const  volatile  

auto:这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量,最常用,因为所有变量默认为就是auto类型的

static:这个关键词可以使变量变得老实,只有当程序改变这个变量的时候,这个变量才可以改变。而且只初始化一次。

详细说明如下:变量会被放在程序的全局存储区中(下次调用不改变原来的值),这点是和堆栈变量的区别;还有就是会限制变量的使用范围(当前文件内使用)和extern互斥。

register:使变量存放在CPU内部的寄存器当中,主要用于提高效率(所申请的变量必须是CPU寄存器可以接受 的值,不可以通过&获得寄存器地址)

extern :意为“外来的”,它的作用就是告诉编译器有这个变量,可能不在当前这个目录需要自己去找,但一定是存在的。还有一个作用就是告诉编译器按照c语言的方式进行编译如: extern “c”{  所要编译的内容};

const:被const修饰的东西受到强制保护,可以防止以外的变动,提高程序的健壮性,可以修饰函数的参数、返回值、甚至函数的定义体。

修饰输入参数:a.对于非内部数据类型的输入参数,应将“值传递”的方式改为“const引用传递 ”,这样可以提高效率如:void Func(A a )改为void Func(const A &a)b.对于内部的数据类型就不要这样(效率不高,可读性不强)

修饰返回值:如果给以“指针传递方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。 (如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。
       如对于: const char * GetString(void); 
       如下语句将出现编译错误: 
        char *str = GetString();//cannot convert from 'const char *' to 'char *'; 
       正确的用法是:

       const char *str = GetString(); 

volatile 表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile. 

  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。 


一个由C/C++编译的程序占用的内存分为以下几个部分 
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 
5、程序代码区—存放函数体的二进制代码。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值