static、auto、register、extern

变量从作用域角度观察,可分为全局变量和局部变量,而从变量存在时间来观察则分为静态存储方式和动态存储方式。

内存中供用户使用的存储空间可分为三部分:

  • 程序区
  • 静态存储区 :全局变量
  • 动态存储区:函数形式参数、函数中定义的没有static关键字的声明变量、函数调用时的现场保护和返回地址

C中的存储类别分为4种:

  • 自动的、
  • 静态的、
  • 寄存器、
  • 外部的、

1.自动变量

在函数内部如果不专门声明static(静态)存储类别,都是动态地分配存储空间,数据存储在动态存储区中

  int f(int a)
  {
   auto int b,c=3;//等价于int b,c=3;
  }

2.静态局部变量(static 局部变量)

我们在函数内部定义的变量都是动态的,当函数执行完毕之后就会被系统回收掉,但有时根据需求,某个变量的值不能被回收,这里有需要加入static局部变量,加上之后这个变量直到程序结束后才会被释放掉,这种形式在就是阶乘时经常用到。

    int fac(int n);

     int i;

  for (i=1; i<=5; i++) {

    printf("%d!=%d\n",i,fac(i));

    }
        int fac(int n)
    {
    static int f=1;
    f=f*n;
    return (f);
    }

3.寄存器变量(register)

在过去机器运算低下的情况下,为提高运算效率允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器中去取,不必再到内存中去取。对寄存器的存取速度远高于对内存的存取速度,这种变量叫做寄存器变量。现在一般都比怎么用。

4.全局变量

全局变量的生命周期是到程序结束,但作用范围却根据在哪里申请而受到限制,主要分为两种情况:

  • 在一个文件内

    int main(int argc, const char * argv[]) {
    
            extern A;
            printf("%d",A);
            return 0;
    }
        int A=10;
    

    我们在main函数下边申请了一个变量A,按照从上到下的顺序,我们不能够在main函数里面调用变量A,但引入extern关键字我们就可以实现。

  • 在两个文件间

    file1文件

    int A=10;
    int main()
    {
        print();
        return 0;
    }
    

    file2文件

    extern A;
    int print()
    {
        int print=A;
        return (A);
    }
    

倘若我们不想让别的文件引入我们的变量我们可以在变量前面加上static,这样就不会出现两个文件间进行互用一个变量了。

我们对static做个总结:

(1)对局部变量用static声明,是为了把它分配在静态存储区,程序执行过程中分配的空间不释放,

(2)对于全局变量用static声明,作用是让变量作用域只限于本文件模块中

时间: 2024-11-08 18:02:58

static、auto、register、extern的相关文章

C语言中关键字auto、static、register、const、volatile、extern的作用

原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.extern 这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)reg

关于C++类的数据成员的存储类型,为什么不能是auto、register和extern

问题描述 关于C++类的数据成员的存储类型,为什么不能是auto.register和extern C++中类的存储类型不能是register和extern可以理解,但为什么不能是auto类型的呀?在结构体中同样出错,在函数中不出错,什么情况? #include<iostream> #include<cmath> using namespace std; class complex { private: auto double real;//编译时此处有错误illegal stora

谷歌禁止厂商定制Android Wear、Auto和TV界面

[TechWeb报道]6月30日消息,据国外媒体报道,谷歌宣布禁止硬件厂商定制Android Wear,Android Auto和Android TV的用户界面,对 它们的用户界面保留唯一控制权.谷歌禁止厂商定制Android Wear.Auto和TV界面作为一个移动平台,原生安卓并不能满足所有用户的需求.硬件厂商们为了吸引更多的用户,只能对原生系统添油加醋.谷歌的举动意味着硬件厂商们将无法靠定制的界面来竞争了,但从好的方面来说这会带给用户更为连贯的体验,起码你不会被各种产品眼花缭乱的界面搞晕.

结构体struct、枚举enum、联合体union、位字段、自定义类型typedef、字节对齐

结构体struct 1 结构体的基本知识 2 结构体与函数 3 结构体数组 4 自引用结构体 枚举变量enum 联合体union 位字段 1 一般的方法定义屏蔽吗 2 用位字段来定义屏蔽吗 自定义类型typedef 字节对齐 pragma pachx 按x个字节对齐 1.结构体struct 1.1 结构体的基本知识 #include <stdio.h> struct point{ int x; int y; }p1, p2, p3; struct point pt; struct point

详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】_javascript技巧

目录 一.AJAX示例 1.1.优点 1.2.缺点 1.3.jQuery AJAX示例 二.延迟对象(Deferred) 2.1.回调函数 2.2.deferred.done 三.跨域 3.1.什么是跨域 3.2.JSONP跨域 3.3.jQuery使用JSONP跨域 3.4.跨域资源共享(CORS) 3.5.小结 四.弹出层 五.模板引擎 5.1.Hello World 5.2.方法 5.3.与AJAX结合应用 六.示例下载 一.AJAX示例 AJAX全称为"Asynchronous Java

CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border).内边距(Padding)和内容(Content),其实盒子模型有两种,分别是 ie 盒子模型和标准 w3c 盒子模型,加上了doctype声明,让所有浏览器都会采用标准 w3c 盒子模型去解释你的盒子.当设置一个元素的样式如下: <!DOCTYPE html> <html> <

JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

一.AJAX示例 AJAX全称为"Asynchronous JavaScript And XML"(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效果. 1.1.优点 不需要插件支持 优秀的用户体验 提高Web程序的性能 减轻服务器和带宽的负担 1.2.缺点 浏览器对XMLHttpRequest对象的支持度不足,几乎所有浏览器现在都支持 破坏浏览器"前进"."后退"按钮的正常功能,可以通过简单的

PowerEdge R430 机架式服务器安装( Ubuntu server 14.04.1 、PHP5.5.9、PHP-redis2.8、Phalcon3.1)

未解决问题:换成静态路由的话,怎么就 apt-get udpate 出现错误信息! 解决办法:么有设置网关 一.Ubuntu 系统下载地址: https://certification.ubuntu.com/certification/hardware/201412-16241/ 2.uiso9_cn_9.6.6.3300.exe 下载 3.ubuntu server12.04系统U盘安装详细教程  https://wenku.baidu.com/view/64e4c33c2b160b4e777

折行显示、回车代替tab、隐去grid的表格线

显示 折行显示.回车代替tab.隐去grid的表格线   1.       在数据窗口(Datawindow)中实现数据列自动折行. PB软件在市场上受用户欢迎的原因之一,就是它的数据窗口功能很强,而且方便应用. 在使用Datawindow时,常会遇到某列的数据太长,不能同时显示全部的情况.若采用自动水平滚动,操作起来又不够简便.有一种方法能实现列数据多行显示(自动折行).具体步骤如下: ①.在Datawindow Panter中打开此DataWindow,在需设定自动折行的列上双击鼠标,弹开此