C++变量的存储类型
C++变量和函数包括两个属性:数据类型和数据的存储类型。存储类型是指数据在内存中存储的方式。变量的存储类型分为四种:自动类型(auto),寄存器类型(register)、静态类型(static)外部类型(extern)其中,自动类型、寄存器类型的变量属于动态变量;静态类型、外部类型的变量属于静态变量。
1.自动类型(auto)
用自动类型关键词auto说明的变量称为自动变量。auto只能修饰局部变量,不能修饰全局变量。
(1)定义格式:
auto 类型 变量名;
(2)特性。
自动变量是动态局部变量,具有块作用域特点,存放在动态存储区。定义时可加auto说明符,也可以省略,所以在程序中没有进行特殊声明都默认是auto型变量,系统以栈(Stack)方式为auto变量分配内存空间,在变量作用域结束后,栈空间由系统进行自动回收。如果自动变量在定义时未初始化,其值默认为随机数。
【示例】
#include<iostream>
using namespace std;
int main() {
int x = 5, y = 10;
for (int k = 1; k <= 2; k++)
{
int m = 0, n = 0;
m = m + 1;
n = n + x+y;
cout << "m=" << m << '\t' << "n=" << n << endl;
}
system("pause");
return 0;
}

2.寄存器类型(register)
用寄存器类型关键词register说明的变量称为寄存器变量。register只能修饰局部变量,不能修饰全局变量。
(1)定义格式:
register 类型 变量名;
(2)特性。
寄存器变量是动态局部变量,具有局部作用域,存放在CPU的寄存器或动态存储区;这样可以提高存取速度,如果没有存放在通用寄存器中,便按自动变量处理。
使用register变量应注意以下几点:
由于通用寄存器的数量有限,寄存器类型的变量不宜过多。
变量的长度应与通用寄存器的长度相当。一般为int型或者char型。通常需要把一些频繁使用的局部变量定义为寄存器变量。
3.静态类型(static)
用静态类型关键词static说明的变量称为静态变量 static可以修饰局部变量和全局变量。因此静态变量分为静态局部变量和静态全局变量。
定义格式:
static 类型 变量名;
在C++中规定静态局部变量有默认值,默认值分别为int型等于0, float型等于0.0,char型为’\0’,静态全局变量也是如此。而自动类型和寄存器类型变量没有默认值,为随机数
静态局部变量
定义在函数内的静态变量称为静态局部变量。
特点如下:
(1)静态局部变量本身也是局部变量,具有局部变量的作用域。其作用域局限在定义它的本函数体内,当离开该函数体后,不可使用该变量,但其值还继续保留。也就是说函数结束时,静态局部变量的存储空间不会被释放。
(2)静态局部变量属于静态存储类别的变量,在程序运行开始就被分配固定的存储单元(占用静态存储区),整个程序运行期间不再被重新分配,生存期是整个程序的运行期间。
(3)静态局部变量的赋初值时间在编译阶段,且仅被初始化一次,并不是每发生一次函数调用就赋一次初值。当再次调用该函数时,静态局部变量会保留上次调用函数时的值
【示例】
#include<iostream>
using namespace std;
void f() {
int x = 0;//x 是自动类型
static int y = 3;//y是局部静态类型
x = x + 1;
y = y + 1;
cout << x << '\t' << y << endl;
}
int main ()
{
int i;
for (i = 0; i < 3; i++)
f();
system("pause");
return 0;
}

分析:x是自动变量,每次调用结束时,变量x的存储单元被释放,然而y是是局部静态类型,静态局部变量的赋初值时间在编译阶段,且仅被初始化一次,并不是每发生一次函数调用就赋一次初值。当再次调用该函数时,静态局部变量会保留上次调用函数时的值。
静态全局变量
在定义全局变量时加说明符static,称为静态全局变量。
静态全局变量只能被定义它的源文件中的所有函数共享。而不能被其他源文件中的函数使用,如果希望全局变量在多个源文件中被使用,则需通过外部(extern)关键字来声明。
静态全局变量的特点如下。
(1)与全局变量基本相同,其作用域是定义它的程序文件中,而不是整个程序中的所有文件。
(2)静态全局变量属于静态存储类别的变量,所以它在程序一开始运行时,就被分配有文件固定的存储单元,默认初始化为0.其生存期是整个程序运行期间。
(3)使用静态全局变量的好处是同一程序的两个不同源程序文件中可以使用相同名称的变量名,而互不干扰。
4.外部类型(extern)
用部类型extern说明的全局变量称为外部变量。extern只能修饰全局变量。
其定义格式为:
extern 类型 变量名;
在由多个源程序文件组成的程序中,如果一个文件要使用另一个文件中定义的全局变量,这些源程序文件之问通过外部类型的变量进行沟通。
在一个文件中定义的全局变量默认为外部的,即作用域可以延伸到程序的其他文件中。但其他文件如果要使用这个文件中定义的全局变量,必须在使用前用extern作外部声明,外部声明通常放在文件的开头。
变量定义时编译器为其分配存储空间,而变量声明指明该全局变量已在其他地方说明过,编译系统不再分配存储空间,直接使用变量定义时所分配的空间。
静态存储(static)类型的作用域与外部(extern)存储类型相反,一旦定义为静态存储类型,就限制该变量只能在定义它的文件中使用,为文件作用域。
C++变量的存储类型的更多相关文章
- (C/C++学习笔记) 九. 变量的存储类型
九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
- C06 变量和存储类型
目录 全局变量 局部变量 存储类型 全局变量和局部变量 变量的作用域 作用域:某些事物起作用或有效的区域. 变量的使用范围称为变量的作用域. 变量的作用域决定了变量的可操作性和有效性. C语言变量的作 ...
- c 变量的存储类型auto等(基础知识)和c函数变量
总结 1).在c语言中每一个变量和函数有两个属性:数据类型和数据的存储类别. 2). 对数据型(如整型.字符型等).存储类别指的是数据在内存中存储的方式. 存储方式分为两大类: 静态存储类和动态存储类 ...
- (C/C++学习笔记)附页: C/C++变量的存储类型
- C语言中【变量】的存储类型共有4种类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 (动态存储) register 寄存器变量(动态存储) extern 外部变量(静态存储) ...
- C和指针笔记 3.7 存储类型
变量的破碎类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久. 有三个地方可以用于存在变量:普通内存.运行时堆栈.硬件寄存器. 变量的缺省存储类型取决于它的声明 ...
- 【C语言学习】存储类型
C语言中的存储类型主要有四种:auto.static.extern.register ★auto存储类型 默认的存储类型.在C语言中,假设忽略了变量的存储类型,那么编译器就会自己主动默认为auto型 ...
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型
Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学 ...
随机推荐
- getopt函数用法
getopt被用来解析命令行选项参数. #include <unistd.h> extern char *optarg; //选项的参数指针 extern int o ...
- ansible-playbook调试
1. ansible-playbook 1)ansible-playbook的语法检测 1 [root@test-1 bin]# ansible-playbook --syntax-check ng ...
- 多测师讲解selenium _a标签定位()_高级讲师肖sir
shift+ctrl+c 快捷键 调出元素
- java9系列第二篇-资源自动关闭的语法增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- JVM 第六篇:极致优化 IDEA 启动速度
本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 引言 相信做 Java 开发的同学,对 IDEA 这个工具应该都不陌生,即使不使用 IDEA 做开发,那么对 Eclipse 这个工具应该 ...
- MeteoInfoLab脚本示例:添加南海脚图
添加南海脚图实际上就是增加一个地图坐标系(Axesm),在用axesm函数创建地图坐标系的时候可以指定position参数(即位置和大小),第1和第2个参数是坐标系的左下角x, y位置,后两个参数是坐 ...
- 【C语言/C++程序员编程】一小时做出来的数字雨(一颗开花的树)!
相信大家看过许许多多的关于计算机黑客.骇客.人工智能.AI方面的电影,每当黑客入侵某个五角大楼,某个网站时,都会出现这样一副画面: 入侵 或者这样的: 数字雨 然后就轻而易举的成功入侵夺取管理员权限了 ...
- CVE-2009-0927-Adobe Reader缓冲区溢出漏洞分析
0x00概述: 此漏洞的成因是由于Adobe Reader在处理PDF文档中所包含的JavaScript脚本时的Collab对象的getlcon()方式不正确处理输入的参数,而产生的缓冲区溢出,成功利 ...
- 快速掌握Java8 Stream函数式编程技巧
函数式编程优势 "函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutabl ...
- centos7下面 es7.5 搭建
centos6 搭建 参考 https://www.cnblogs.com/php-linux/p/8758788.html 搭建linux虚拟机 https://www.cnblogs.com/ph ...