C语言之变量的存储方式和生存周期

一、变量的存储方式

C语言变量的存储有两种方式:静态存储方式和动态存储方式,相应的生产期也有两种:静态生存期和自动生存期。

①静态存储方式:在程序运行前为变量内存分配内存,在程序结束后回收变量的内存。(静态生存期)

②动态存储方式:在程序运行过程中,根据需要动态地分配或回收内存,与静态存储方式相比,动态存储方式,具有更好的存储效率。(自动生存期)

注意:

1.所有的全局变量都是静态存储方式

2.局部变量要根据存储类型来区分具体的存储方式。

二、局部变量的三种储存类型

三种储存类型:自动变量、静态局部变量、寄存器变量

①自动变量

自动变量的定义方式:

auto <数据类型> <变量名>

如:

auto int a;

当然,auto也可以省略不写,因为但凡没有声明储存类型的局部变量,一律默认为自动变量。

自动变量的分配和回收

只有在局部变量的作用域,自动变量才能被引用。

在程序进入作用域,编译系统自动为其提供内存;在离开作用域后,回收其内存。

例1:比较两数大小的函数:

#include <stdio.h>

int max(int x,int y)     //主函数调用该函数进行传参时,为x,y分配内存
{                  
	int z;               //执行至此,为z分配内存
	if(x > y)
		z = x;
	else
		z = y;
	return z;            //执行至此,回收x,y,z的内存

}
int main()
{
	int a, b, c;         //执行至此,为a,b,c分配内存
	scanf("%d%d", &a, &b);
	c = max(a,b);        
	printf("max=%d\n",c);//执行至此,回收a,b,c的内存
	return 0;
}

例2,

#include <stdio.h>

int fac(int n)
{
	int f = 10;
	f = f * n;
	return (f);
}
int main()
{
    int fac(int n);
	int s;
	s = fac(2);
	printf("第一次调用的s:%d\n",s);
	s = fac(3);
	printf("第二次调用的s:%d\n",s);
	return 0;
}

运行结果:

 程序分析:

1、由于f定义为自动变量,程序进入函数是为f分配内存,函数返回时回收内存

2、第一调用fac函数fac返回时f的内存被回收,第二次调用fac函数,又重新给f分配内存,所以两次的f是相互独立的变量。

②静态局部变量(static 局部变量)

定义形式:static  <数据类型> <变量名>,如:

static int b;

如果不初始化,默认变量值为0;

如果要将上述程序的变量f定义为静态变量:

#include <stdio.h>

int fac(int n)
{
	static int f = 10;
	f = f * n;
	return (f);
}
int main()
{
    int fac(int n);
	int s;
	s = fac(2);
	printf("第一次调用的s:%d\n",s);
	s = fac(3);
	printf("第二次调用的s:%d\n",s);
	return 0;
}

运行结果:

程序分析:

1、由于f是静态变量,因此在程序执行前就为f分配内存,在运行过程中不会再次初始化,直到程序结束才回收内存。

2、因此,两次被调用的f是同意变量,第一次调用的f的值会继续保留给第二次调用。

例3、输出1到5的阶乘值 

#include <stdio.h>
int fac(int n)
{
	static int f = 1;
	f = f * n;
	return f;
}
int main()
{
	int i;
	for(i = 1;i <= 5;i ++)
	{
		printf("%d!=%d\n", i, fac(i));
	}
	return 0;
}

 

运行结果:

③寄存器变量

寄存器变量是存储在CPU寄存器的自动变量,便于快速访问。

寄存器变量的定义方式:register 数据类型 变量名

注意:由于寄存器变量存储在CPU的寄存器中,不存储在内存单元中,无法进行取地址运算

最近更新

  1. TCP协议是安全的吗?

    2023-12-17 10:40:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-17 10:40:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-17 10:40:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-17 10:40:03       20 阅读

热门阅读

  1. 用单片机控制步进电机的程序

    2023-12-17 10:40:03       41 阅读
  2. ssh连接试图写入的管道不存在

    2023-12-17 10:40:03       58 阅读
  3. 146. LRU 缓存

    2023-12-17 10:40:03       50 阅读
  4. 103个校招C++语法面试题

    2023-12-17 10:40:03       22 阅读
  5. 半导体:Gem/Secs基本协议库的开发(4)

    2023-12-17 10:40:03       44 阅读
  6. qt程序在Linux下打包的一般流程

    2023-12-17 10:40:03       49 阅读
  7. 基于SpringBoot的在线疫苗预防小程序

    2023-12-17 10:40:03       70 阅读
  8. 【Python】【PyPi】搭建本地PyPi镜像源

    2023-12-17 10:40:03       66 阅读
  9. MinIO入门

    2023-12-17 10:40:03       40 阅读
  10. 在Linux上使用mysqldump备份MySQL数据库的详细步骤

    2023-12-17 10:40:03       51 阅读
  11. 43 贪心算法 -第K个排列

    2023-12-17 10:40:03       56 阅读
  12. 【自用】Mathematica 使用

    2023-12-17 10:40:03       41 阅读
  13. flutter学习-day12-可滚动组件和监听

    2023-12-17 10:40:03       27 阅读