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++变量的存储类型的更多相关文章

  1. (C/C++学习笔记) 九. 变量的存储类型

    九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...

  2. C语言中变量的存储类型

    在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...

  3. C06 变量和存储类型

    目录 全局变量 局部变量 存储类型 全局变量和局部变量 变量的作用域 作用域:某些事物起作用或有效的区域. 变量的使用范围称为变量的作用域. 变量的作用域决定了变量的可操作性和有效性. C语言变量的作 ...

  4. c 变量的存储类型auto等(基础知识)和c函数变量

    总结 1).在c语言中每一个变量和函数有两个属性:数据类型和数据的存储类别. 2). 对数据型(如整型.字符型等).存储类别指的是数据在内存中存储的方式. 存储方式分为两大类: 静态存储类和动态存储类 ...

  5. (C/C++学习笔记)附页: C/C++变量的存储类型

  6. C语言中【变量】的存储类型共有4种类型

    在C语言中,对变量的存储类型说明有以下四种:   auto          自动变量 (动态存储) register     寄存器变量(动态存储) extern       外部变量(静态存储) ...

  7. C和指针笔记 3.7 存储类型

    变量的破碎类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久. 有三个地方可以用于存在变量:普通内存.运行时堆栈.硬件寄存器. 变量的缺省存储类型取决于它的声明 ...

  8. 【C语言学习】存储类型

    C语言中的存储类型主要有四种:auto.static.extern.register ★auto存储类型 默认的存储类型.在C语言中,假设忽略了变量的存储类型,那么编译器就会自己主动默认为auto型 ...

  9. C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型

    Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学 ...

随机推荐

  1. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  2. rustup命令速度慢

    通过以下命令更换镜像: $ENV:RUSTUP_DIST_SERVER='https://mirrors.ustc.edu.cn/rust-static' $ENV:RUSTUP_UPDATE_ROO ...

  3. 如何使用 dotTrace 来诊断 netcore 应用的性能问题

    最近在为 Newbe.Claptrap 做性能升级,因此将过程中使用到的 dotTrace 软件的基础用法介绍给各位开发者. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架. ...

  4. Java之线程池解析

    线程池 目录 线程池 线程池概述 创建一个线程池并提交线程任务 线程池源码解析 参数认识 构造方法 提交任务 addWorker 执行任务 关闭线程池 线程池概述 什么是线程池 为什么使用线程池 线程 ...

  5. Redis 中 BitMap 的使用场景

    BitMap BitMap 原本的含义是用一个比特位来映射某个元素的状态.由于一个比特位只能表示 0 和 1 两种状态,所以 BitMap 能映射的状态有限,但是使用比特位的优势是能大量的节省内存空间 ...

  6. 多测师讲解a'pi自动化框架设计思想_高级讲师肖sir

    API自动化框架API自动化框架分为conf.data.utils.api.testcase.runner.report.log8个模块.conf是用来储存系统环境.数据库.邮件等的配置参数.项目的绝 ...

  7. selenium等待机制学习笔记

    转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...

  8. git添加空文件夹

    最近刚接触git这个工具,发现git是不能提交空文件的:找了下资料,找到了解决提交文件夹的办法,现在记录一下. git是不允许提交一个空的目录到版本库上的,可以在空文件夹下面添加.gitkeep文件, ...

  9. filezilla pureftpd 读取目录列表失败

    放行   21, 39000 - 40000端口

  10. LruCache缓存bitmap(三)

    应用在网络连接上,onrestart后不会重新联网获取图片,省去了流量, public class MainActivity extends AppCompatActivity { ImageView ...