当前位置: 代码迷 >> 综合 >> C语言中存储类型auto,static,extern,register
  详细解决方案

C语言中存储类型auto,static,extern,register

热度:53   发布时间:2023-12-25 04:37:18.0

1.在我们的内存中,会分为三块:静态区,堆区,栈区。外部变量和全局变量存放在静态区,局部变量存放在栈区,动态开辟的内存存在堆区。

2.auto类型:其实在函数中的局部变量,不加特殊声明,都是auto变量,但是关键字”auto”可以被省略。这些变量在函数被调用时分配存储方式,函数调用结束后这些存储空间就被释放了。

C语言中隐含的存储类型是 auto

3.static类型: 静态类型数据,数据存放在全局数据区,但作用域只是本文件/函数 中,所以你可以在两个不同的文件/函数内部申明同名的static变量,但是它们是两个不同的全局变量。两个注意点
①如果是定义在函数内,那么函数外不能对其访问。
②如果是定义在函数外,那么该对象具有内部链接,其它程序文件不能对其访问

函数调用结束后,这些变量不消失,而保留当前数据,下一次调用时变量的值为上一次调用完成后的值

#include "stdio.h"
static int i=5;
int add(int x){// static int i=5;
}
int main(){printf("%d\n",i );return 0;
}

3.extern类型
外部变量声明,是指这是一个已在别的地方定义过的对象,这里只是对变量的一次重复引用,不会产生新的变量

这在复杂的大型工程中会用到,比如我在我的程序中需要用到小明写的程序中的变量a,那么我在自己的程序中声明
extern int a;
告诉编译器这是别人模块中的变量,我拿过来用一下。

  • extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”

4.register类型
Register修饰符暗示编译程序相应的变量将将被频繁使用,如果可能的话,应将其保存在CPU的寄存器中,以指加快其存取速度。但是,使用register修饰符有几点限制:
(1)只有局部自动变量和形式参数可以作为寄存器变量,其他(如全局变量)不行。
(2)CPU的寄存器数目有限,因此,即使定义了寄存器变量,编译器可能并不真正为其分配寄存器,而是将其当做普通的auto变量来对待,为其分配栈内存。当然,有些优秀的编译器,能自动识别使用频繁的变量,如循环控制变量等,在有可用的寄存器时,即使没有使用 register 关键字,也自动为其分配寄存器,无须由程序员来指定。
(3)局部静态变量不能定义为寄存器变量。因为一个变量只能声明为一种存储类别。

其实这个变量已经过时,因为现在的计算机处理速度够快,所以很少使用

这里写图片描述

  相关解决方案