变量的储存类型决定标量何时创建,何时销毁以及他的值保持多久。有三个地方可以储存变量:

    普通内存static

    运行时堆栈auto

    硬件寄存器register

  变量的缺省储存类型取决于它的声明位置:

静态变量static: 凡是在代码块之外声明的变量总是存储于静态内存中,不属于堆栈的内存,无法为他们指定其他的储存类型,静态变量在程序运行之前创建,在整个程序执行期间始终存在,他始终保持原先的值,除非给他赋一个不同的值或者程序结束

  

自动变量auto:  在代码块内部声明的变量,储存于堆栈中,称为自动变量,在程序执行到自动变量的代码块时,自动变量才被创建,当程序执行流离开代码块时,这些自动变量自动销毁。

  代码块内部的变量如果加上关键词static,可以使他的储存类型变为static,在整个程序执行过程一直存在

  

#include <stdio.h>

void showMsg()
{
static count = 0;
count++;
printf("count: %d\n", count);
} int main()
{
int index;
for (index = 0; index < 10; index++)
{
showMsg();
}
return 0;
}

count为静态变量,一直存在,所以该程序输出:

修改变量的储存类型,并不改变变量的作用域,它任只能在代码块内部按名字访问。

register:提示储存于机器的硬件寄存器而不是内存中,称为寄存器变量。寄存器变量比内存变量更高效,但是具体实现依赖于编译器#_#

  寄存器变量的创建和销毁时间和自动变量一样,但是他需要一些额外的工作,在一个使用寄存器变量的函数返回之前,这些寄存器之前所保持的值必须被恢复,确保调用者的寄存器变量未被破坏,一般是通过堆栈来实现,函数开始之前,先把寄存器变量内部的值保持到堆栈中,当函数返回时,这些值再被放回寄存器中。

  由于寄存器在不同时刻保存的值不同,所以机器一般不提供寄存器的变量地址。

初始化:

  静态变量和自动变量的初始化是不相同的,静态变量在程序链接时存放的位置就确定了,可以在这个时候为静态变量赋上初始化值,如果没有赋值,默认的静态变量初始化为0

  自动变量是在程序链接时还无法确定存放的位置,所以如果没有显示的初始化,那么自动变量存放的值将是垃圾数据。好处是由于是在运行时初始化,所以可以使用任何表达式作为初始化值。同时由于变量需要时才为他们分配储存,可以减少内存需求。

int function(int a)
{
int b = a + 3;
}

  b的值是在运行时才确定的。

关于static关键词

  不同上下文static的关键词具有不同含义。

  当static位于函数定义时,代码块之外的变量声明时,static是用来修改标识符的链接属性的,从external修改为internal,但标识符的储存类型和作用域不受影响。这中方式声明的函数或者变量只能在声明它的源文件中被访问。

  当static位于代码块内部的变量声明时,static关键词用于修改变量的储存类型,从自动变量修改为静态变量,变量的链接属性和作用域不受影响。这种方式声明的变量在程序执行之前创建,并且在整个执行期间一直存在。

C和指针 第三章 变量的储存类型 auto、static、register以及static关键词的更多相关文章

  1. C++ Primer 第2章 变量和基本类型

    C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...

  2. C++ Primer 读书笔记 第2章 变量和基本类型

    C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...

  3. <<C++ Primer>> 第二章 变量和基本类型 术语表

    术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节    别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...

  4. C++ Primer 笔记(2)第二章 变量与基本类型

    第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常 ...

  5. C和指针 第三章--数据

    简要概述: <C和指针>第三章对数据进行了描述. 其中主要讲解了---变量的三个属性:作用域.链接属性和存储类型. 这三个属性决定了该变量在“什么地方可以使用”以及“该变量的值能够保持多久 ...

  6. C和指针 第三章 链接属性 extern、internal、none

    三种链接属性 组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符. 链接属性有三种: external:外部 多个源文件中的相同标识 ...

  7. C和指针 第三章 习题

    在一个源文件中,有两个函数x和y,定义一个链接属性external储存类型static的变量a,且y可以访问,x不可以访问,该如何定义呢? #include <stdio.h> void ...

  8. C++ Primer 5th 第2章 变量和基本类型

    *****代码在Debian g++ 5.3.1 / clang++ 3.8(C++11)下编写调试***** 由于部分编译器对标准遵循的不同以及自身额外的扩展,本章书中的少数知识点与实际实现存在偏差 ...

  9. C#高级编程 (第六版) 学习 第三章:对象和类型

    第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上   2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件   函数成员 方法:与某个类相关的函数,可以 ...

随机推荐

  1. ACM失败之路

    校赛打完,已过四月,该是准备背起行囊,踏上考研之路了,自然,得先阔别一下ACM了,想起这几年ACM路,感慨颇多,不得不一诉心肠,与大家分享一下我的ACM历程,如果有人能从此文获取一些益处,那我就很欣慰 ...

  2. 有关sql server 2008无法导入数据库mdf文件的处理方法

    解决方法1:根据该博客中的引导,加上自己安装版本的细节,可以添加成功 http://www.2cto.com/database/201408/328930.html 解决方法2: 根据<数据库系 ...

  3. jmeter(四)Sample之http请求

    启动jmeter,建立一个测试计划 这里再次说说怎么安装和启动jmeter吧,昨天下午又被人问到怎样安装和使用,我也是醉了:在我看来,百度能解决百分之八十的问题,特别是基础的问题... 安装:去官网下 ...

  4. eclipse自动提示功能没了的解决办法(转载)

    eclipse自动提示功能没了的解决办法 标签: eclipse联想 2012-08-09 14:32 24687人阅读 评论(7) 收藏 举报  分类: Android(38)  版权声明:本文为博 ...

  5. WPF MVVM 验证

    WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...

  6. docker搭建ros-indigo-arm交叉编译环境

    ROS运行环境:ARM ubuntu14.04 + ROS indigo在arm环境下编译ros应用程序,速度极慢,无法忍受,尝试在x86机器上搭建docker+ros交叉编译环境. 交叉编译环境的搭 ...

  7. 如何设置ASP.NET页面的运行超时时间

    全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值.Machine.config 文件位于 % ...

  8. 备忘:mybatis 3的使用记录

    这是一篇记录.mybatis是一个部分模仿ORM的framework.是一个介于ORM和原始JDBC的框架.既可以提供ORM的操作对象的特性,又能从详细地控制最终的SQL.达到一个平衡.我们还是得写s ...

  9. 几种xml读取方法比较

    背景 这几天手上有个活,解析xml,众所周知xml的解析方法有: DOM SAX linq to xml plinq 测试用xml和生成代码 static void CreateFile() { ; ...

  10. 解决 Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

    转载 php 5个版本,5.2.5.3.5.4.5.5,怕跟不上时代,新的服务器直接上5.5,但是程序出现如下错误:Deprecated: mysql_connect(): The mysql ext ...