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. TP5上传图片到七牛云,并且删除七牛云的图片

    一,通过composer 下载七牛云 sdk composer require qiniu/php-sdk 二,手动下载七牛云sdk 1,https://developer.qiniu.com/kod ...

  2. js获取foreach循环选中的值

    一,循环出来的值,通过checked选中,获取到value值 二,定义一个空数组,用push将数据保存在数组里面 以上操作便可以进行虎丘选中的值了

  3. 关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示

    前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP.定制给 ...

  4. 【git】关联本地仓库与远程仓库

    1.在远程建立一个空项目[项目名称]2.git init3.git remote add origin [git 地址]4.git pull origin master5.git push origi ...

  5. hasura的golang反向代理

    概述 反向代理代码 对请求的处理 对返回值的处理 遇到的问题 概述 一直在寻找一个好用的 graphql 服务, 之前使用比较多的是 prisma, 但是 prisma1 很久不再维护了, 而 pri ...

  6. 多测师讲解自动化测试 _RF分配id_高级讲师肖sir

    1.Assign Id To Element.

  7. 本溪6397.7539(薇)xiaojie:本溪哪里有xiaomei

    本溪哪里有小姐服务大保健[微信:6397.7539倩儿小妹[本溪叫小姐服务√o服务微信:6397.7539倩儿小妹[本溪叫小姐服务][十微信:6397.7539倩儿小妹][本溪叫小姐包夜服务][十微信 ...

  8. 99%的Android开发不得不面对的三道坎,到底该怎么破?

    今年比往年要特殊一些,受疫情的影响,很多公司都出现了裁员现象.以至于最近很多技术同学也在纷纷向我倒苦水. 王鹏便是其中的一员,王鹏之前是在一线城市的一家小型互联网公司做Android应用开发.从毕业实 ...

  9. 例题4-2 刽子手游戏(Hangman Judge, UVa 489)

    #include<stdio.h> #include<string.h> int ok ,no; int left ,chance; char s[20] ,s2[20]; v ...

  10. 习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)

    #include<stdio.h> #include<string.h> #include<ctype.h> double getweight(char x) { ...