zoukankan      html  css  js  c++  java
  • C和指针 第三章 变量的储存类型 auto、static、register以及static关键词

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

        普通内存static

        运行时堆栈auto

        硬件寄存器register

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

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

      

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

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

      

    #include <stdio.h>
    
    void showMsg()
    {
    	static count = 0;
    	count++;
    	printf("count: %d
    ", 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关键词用于修改变量的储存类型,从自动变量修改为静态变量,变量的链接属性和作用域不受影响。这种方式声明的变量在程序执行之前创建,并且在整个执行期间一直存在。

  • 相关阅读:
    bzoj 4017: 小Q的无敌异或
    [TJOI2014] Alice and Bob
    [TJOI2014] 上升子序列
    bzoj 3261: 最大异或和
    bzoj3087: Coci2009 misolovke
    bzoj3521: [Poi2014]Salad Bar
    bzoj4032: [HEOI2015]最短不公共子串
    bzoj1027: [JSOI2007]合金
    bzoj4637: 期望
    bzoj3919: [Baltic2014]portals
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/5767962.html
Copyright © 2011-2022 走看看