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

2023-12-17

一、变量的存储方式

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言之变量的存储方式和生存周期 的相关文章

随机推荐

  • 传输层协议

    目录 UDP协议 如何向上交付 如何解包 UDP协议的特点 UDP是全双工的 UDP面向数据报 TCP协议 如何向上交付 如何解包 4位首部长度 TCP的可靠性 序号与确认序号 16位窗口大小 6位标记 为什么需要6位标记 ACK SYN
  • Python获取去哪儿旅游数据并作可视化攻略

    嗨喽 大家好呀 这里是爱看美女的茜茜呐 开发环境 版 本 python 3 8 编辑器 pycharm 第三方库 requests gt gt gt pip install requests parsel gt gt gt pip inst
  • Java基础语法..

    1 Java程序和Java项目 一个Java程序是由类 函数 语句组成的 其中类包含函数 函数包含语句 一个Java项目允许存在多个main函数 其实函数就是方法 如果你运行的对象是Java项目的话 那么他只能选择项目中的其中一个main函
  • 微服务架构企业级精品项目——天机学堂

    1 学习背景 各位同学大家好 经过前面的学习我们已经掌握了 微服务架构 的核心技术栈 相信大家也体会到了微服务架构相对于项目一的单体架构要复杂很多 你的脑袋里也会有很多的问号 微服务架构该如何拆分 到了公司中我需要自己搭建微服务项目吗 如果
  • 单片机毕设分享 基于单片机的风速测量系统 - 物联网 嵌入式 stm32 arduino

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 风速计简介 Adafruit风速计传感器 5 软件说明 Arduino风速计的源代码 程序
  • 什么是概率匹配

    概率匹配是一种在信息论和统计学中常用的方法 用于将一个随机事件的概率分布与另一个概率分布进行匹配或逼近 它在数据处理 编码 压缩和模型选择等领域具有重要的应用 为我们理解和处理复杂的概率分布提供了一种有效的工具 首先 让我们来了解概率匹配的
  • 【故障识别】基于遗传算法优化长短期记忆神经网络GA-LSTM 实现数据分类预测附matlab实现

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 代码获取 论文复现及科研仿真合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab完整代码及仿真定制内容点击 智能优化算法 神经网络预测 雷达通信
  • 【MySQL内置函数】

    目录 前言 一 日期函数 获取日期 获取时间 获取时间戳 在日期上增加时间 在日期上减去时间
  • 【工具栏】(idea)背景图像

    下载之后
  • stm32项目分享 - 单片机森林火灾监控防护预警系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 SIM800L模块的工作原理 基于物联网的森林火灾探测系统框图 Arduino火灾检测系统的电路图 5 软件说明
  • “宠物之家”宠物救助系统的设计与实现 毕业设计源码40439

    赠送源码 毕业设计 SSM 宠物之家 宠物救助系统 https www bilibili com video BV1ag4y1f7rg vd source 72970c26ba7734ebd1a34aa537ef5301 SSM 宠物之家
  • 自信息量和一阶熵

    信息论中 自信息量和一阶熵是用来度量信息的重要概念 它们提供了一种方式来理解和量化信息的不确定性和平均量 对于解决信息传输 编码和存储等问题非常有用 首先 让我们来了解一下自信息量 自信息量是用来度量一个事件的信息量或不确定性的大小 假设有
  • 学 Linux 必会的 ARM 汇编指令

    学习 Linux 系统启动流程 必须熟悉几个汇编指令 总结给大家 这里不是最全的 只列出一些最常用的汇编指令 一 数据处理指令 1 数据传送指令 MOV指令 把一个寄存器的值 立即数 赋给另一个寄存器 或者将一个常量赋给寄存器 MOV指令的
  • lv12 uboot源码配置编译 8

    目录 1 uboot源码获取 2 uboot特定 3 uboot源码结构 3 1 平台相关代码 3 1 1 arch 3 1 2 board 3 2 平台无关代码 3 2 1 common下放的都是uboot的命令 3 3 配置文件 帮助文
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • prometheus监控交换机

    本例以监控华为交换机为例 prometheus环境搭建见前面的文章 1 环境准备 yum install y gcc gcc g make net snmp net snmp utils net snmp libs net snmp dev
  • Java前言..

    1 软件开发的分类 软件开发我们可以将其分成三类 移动开发 Android iOS 前端开发 HTML CSS JavaScript 后台开发 Java Python C 2 软件开发的分工 其中移动开发负责开发一些移动设备上的应用 前端开
  • 计算机网络---vlan、单臂路由、静态路由综合案例配置(命令版)

    基础命令 1 检查设备是否连通 ping lt 目标主机 gt 例 ping 192 168 1 1 拓展 ping t lt 目标主机 gt 将不断发送ping请求 直至手动中断该命令 ctrl c ping c 4 lt 目标主机 gt
  • 牛客小白月赛83

    A 小天的金银铜铁 牛客小白月赛83 nowcoder com AC代码 include
  • C语言之变量的存储方式和生存周期

    一 变量的存储方式 C语言变量的存储有两种方式 静态存储方式和动态存储方式 相应的生产期也有两种 静态生存期和自动生存期 静态存储方式 在程序运行前为变量内存分配内存 在程序结束后回收变量的内存 静态生存期 动态存储方式 在程序运行过程中