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声明,作用是让变量作用域只限于本文件模块中

目录
相关文章
|
2月前
|
存储 编译器 C语言
详解C/C++中的static和extern
本文详解了C/C++中`static`和`extern`关键字的用法和区别,通过具体代码示例说明了在不同情境下如何正确使用这两个关键字,以及`extern "C"`在C++中用于兼容C语言库的特殊作用。
详解C/C++中的static和extern
|
6月前
|
C++
C总结-关键字 static const extern
C总结-关键字 static const extern
39 0
|
6月前
|
存储 C语言
static和extern
`static`和`extern`是C语言的关键字。`static`用于修饰局部变量、全局变量和函数,改变它们的生命周期和作用域。局部静态变量在函数结束后不会销毁,保持其值直到程序结束。全局静态变量限制为只在当前源文件可见,减少命名冲突。`extern`则用于声明外部已定义的符号,使得在其他文件中可以访问该全局变量或函数。总的来说,`static`和`extern`影响变量和函数的可见性和存储持续时间。
36 0
|
6月前
|
存储 C语言
static和extern详解
static和extern详解
51 0
|
存储 数据库 开发者
extern,const,#define
extern,const,#define
73 0
解决办法:error LNK2005: "void * __cdecl operator new(unsigned int)" 已经在 LIBCMTD.lib(new.obj) 中定义
解决办法:error LNK2005: "void * __cdecl operator new(unsigned int)" 已经在 LIBCMTD.lib(new.obj) 中定义
258 0
|
编译器 C++
尽量以const、enum、inline替换#define
尽量以const、enum、inline替换#define
184 0
尽量以const、enum、inline替换#define
_main函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)
_main函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)
_main函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)
|
JSON Go 数据格式
解决:interface conversion: interface {} is float64, not int
今天遇到一个小坑,但是自己陷进去好久,说起来有些不好意思,但是感觉还是应该拿出来晒一晒,希望大家别再被类似的问题耽误了。
1053 0
解决办法:error LNK2005: &quot;void * __cdecl operator new(unsigned int)&quot; 已经在 LIBCMTD.lib(new.obj) 中定义
解决办法:error LNK2005: &quot;void * __cdecl operator new(unsigned int)&quot; 已经在 LIBCMTD.lib(new.obj) 中定义
211 0