zoukankan      html  css  js  c++  java
  • 存储类型

    【1】存储类型分为哪几种?

    C/C++的存储类型从宏观可以分为两种:

    一种是临时性的,即就是暂时的保存在栈中或者寄存器中的。 代表存储标识:auto, register

    一种是永久性的,即就是在整个程序的运行期都存在的。代表存储标识:extern, static

    一个变量或者函数只能具有一个存储类型,意味着也只能有一种生存期限。

    【2】各种存储类型各有什么特点?

    (1)auto

    auto变量是用栈方式占用内存空间的。也就意味着所有的局部变量都是自动的。一般不显式标注存储类型的变量默认方式均为auto。

    它们在函数被调用时创建,函数退出时自动销毁。作用域都为块作用域。

    (2)register

    register修饰符暗示编译程序相应的变量将将被频繁使用。如果可能的话,应将其保存在CPU的寄存器中,旨在加快其存取速度。

    但是,凡事都有一个度的问题,使用 register修饰符也有几点限制:  

    <1>register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小於或等於整型的长度。

    当然,有些机器的寄存器也能存放浮点数。

    <2>因为register变量可能不存放在内存中,所以不能用取址符运算符“ & ”来获取取址符运算符“ &” register变量的地址。

    如果你试图这样做,编译时就会报告这是一个错误。

    <3>只有局部变量和形参可以作为register变量,全局变量不行。

    <4>80x86系列CPU最多可使用的register变量数目有限。

    <5>静态变量不能定义为register。

    (3)extern

    默认情况下,"全局变量和全局函数"的存储类型是extern。能够被定义在它们之后的同一个编译单元内的函数所调用。

    如果变量或者函数被显式加上extern声明,那么说明已经在其他编译单元实现了该变量或者函数的定义,在此单元中尽管调用它们即可。

    (4)static

     static的作用可以说有三方面,下面分别讨论:

    <1>限制全局变量和函数的作用域。

    我们知道,全局的变量或者函数一般都是公共的,那么公共的就比较讨厌了!因为谁想用谁就可以不择手段的使用了,这就成什么了?你说呢?

    所以,为了限制这种不良的使用权限,我们使用static进行限制和约束。加修饰符static的全局函数或者变量,仅仅只可以被这个文件的其他函数使用。

    加修饰符的局部变量,被保存在静态区域,而且只是第一次创建变量时进行一次赋值,以后的运算都是建立在此基础之上的。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int fun(int a)
     5 {
     6     static int x=a;
     7     x += 10; 
     8     cout<<x<<"  ";
     9     return x;
    10 }
    11 void main()
    12 {
    13     for(int i = 10; i > 0; --i)
    14     {
    15         fun(i);  
    16     }
    17 }
    18 //运行结果如下:
    19 //20  30  40  50  60  70  80  90  100  110
    20 //说明:在第一次给静态成员变量赋值以后,其值再不会改变!!!!

    <2>保持变量内容的持久性

    这点怎么理解呢?就上面的这个例子。完全可以说明这一点了,如果还没有看明白,反复继续........不用心研究,就不会学到知识。

    <3>初始化默认值为零。

    不论是全局的还是局部的变量,它如果在定义时没有被初始化。那么系统默认赋予的值均为0。

     

     

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    HTML5 WEB SQL
    Android-day04
    Android-day03
    Android-day02
    Android-day01
    java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
    事务管理、整合Junit、整合Web、SSH整合
    AOP、AspectJ、JdbcTemplate
    Spring基础
    Hibernate对连接池的支持
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2839802.html
Copyright © 2011-2022 走看看