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

2023-12-17 12:20:23

一、变量的存储方式

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的寄存器中,不存储在内存单元中,无法进行取地址运算

文章来源:https://blog.csdn.net/m0_62440901/article/details/135023819
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。