当前位置: 首页 > news >正文

【C语言】全局变量、局部变量和静态变量的区别

目录

  • 一、变量
    • (一)全局变量
    • (二)局部变量
    • (三)静态变量
      • (1)静态全局变量
      • (2)静态局部变量
  • 二、常量

一、变量

1、变量定义
变量的名称可以由字母、数字和下划线字符组成,它必须以字母或下划线开头,C语言区分大小写;C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等。

变量就是程序可操作的存储区的名称,变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,例如:

type variable; 	
type variable1,	variable2...;
type variable = value; 	// 变量可以在声明的时候被初始化(指定一个初始值)

type 必须是一个有效的 C 数据类型,可以是 char、w_char、int、float、double 或任何用户自定义的对象,variable可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。
2、变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。

变量的声明有两种情况:

(1)一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
(2)另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。

extern int i; //声明,不是定义
int i; //声明,也是定义

除非有extern关键字,否则都是变量的定义。

如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。

#include <stdio.h>
/*外部变量声明*/
extern int a;
extern int b;
int add()
{return a + b;
}

(一)全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问,也就是说,全局变量在声明后整个程序中都是可用的。
注意:

  1. 在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用,也就是说,函数内部的定义的局部变量优先级高于全局变量。
  2. 全局变量不属于某个函数,它的有效范围定定义该全局变量的位置开始直至源文件结束。
  3. 全局变量允许多个函数对某个变量进行修改,但破坏了函数的独立性。
  4. 全局变量在程序执行过程中始终占用存储单元,而局部变量只有在使用的时候才会分配存储空间。

例如:

#include <stdio.h>
/*全局变量声明*/
int a;
int b;
int add()
{return a + b;
}

(二)局部变量

在某个函数或块的内部声明的变量称为局部变量,它们只能被该函数或该代码块内部的语句使用,局部变量在函数外部是不可知的。
注意:

  1. 形参属于被调函数的局部变量,实参则属于主调函数的局部变量。
  2. 不同的函数中,可以使用相同的局部变量名。
  3. 主函数中的变量只能在主函数中使用,不能在其他函数中使用。
  4. 复合语句中定义变量,其作用域只能在复合语句范围内。
  5. 局部变量只有在使用的时候才会分配存储空间,使用结束后回收。

例如:

int main ()
{/* 局部变量声明 */int a, b;int c;/* 实际初始化 */a = 10;b = 20;c = a + b;printf ("value of a = %d, b = %d and c = %d\n", a, b, c);return 0;
}

(三)静态变量

静态变量的修饰关键字是static,static可以作用于变量以及函数。由static修饰的,可分为静态局部变量,静态全局变量,静态函数。静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收存储空间。 静态变量属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

(1)静态全局变量

在全局变量的定义前加上static就构成了静态全局变量,静态全局变量只初使化一次,防止在其他文件单元中被引用。静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
例如:

#include <stdio.h>
/*静态全局变量声明*/
static int a;
static int b;
int add()
{return a + b;
}

(2)静态局部变量

在局部变量的定义前加上static就构成了静态局部变量,静态局部变量只会被初始化一次,下次使用依据上一次保存的值。静态局部变量在函数内定义 ,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。

静态局部变量是一种生存期为整个源程序的变量,虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了上次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。
例如:

#include <stdio.h>int add(int x,int y){return x + y;
}int main(){static int a = 10;static int b = 5;int result;result = add(a,b);printf("sum: %d",result);return 0;
}

二、常量

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改

在 C 语言中,有两种简单的定义常量的方式:
1、使用 #define 预处理器

#define identifier value

例如:

#include <stdio.h>
//	此时,a和b为常量,其值不可被修改
#define a 10  
#define b 20  
int add()
{return a + b;
}

2、使用 const 关键字
const 声明常量要在一个语句内完成,尽量把常量定义为大写字母形式

const type VAR= value;
const int VAR= 5;	//	正确定义
const int VAR;		//	错误定义
//	错误定义
const int VAR;		
VAR= 5;

相关文章:

【C语言】全局变量、局部变量和静态变量的区别

目录一、变量&#xff08;一&#xff09;全局变量&#xff08;二&#xff09;局部变量&#xff08;三&#xff09;静态变量&#xff08;1&#xff09;静态全局变量&#xff08;2&#xff09;静态局部变量二、常量一、变量 1、变量定义 变量的名称可以由字母、数字和下划线字符…...

血氧仪「上潜」,智能穿戴「下沉」

文|智能相对论作者|沈浪缺货、涨价、一“仪”难求......过去短短的几周&#xff0c;血氧仪市场持续走热&#xff0c;受到前所未有的关注&#xff0c;像鱼跃医疗这样的业内巨头更是赚得盆满钵满&#xff0c;但同时也深陷“发国难财”的舆论泥潭&#xff0c;说来也是唏嘘。尽管目…...

CPP2022-计算机类-期末考试

6-1 判断素数 分数 5 全屏浏览题目 切换布局 作者 李国瑞 单位 东北大学秦皇岛分校 设计一个函数&#xff0c;判断输入数据是否为素数&#xff0c;返回bool类型结果。 函数接口定义&#xff1a; bool prime(int num); 说明&#xff1a;num为正整数。 裁判测试程序样例&…...

【蓝桥集训】第二天——差分

作者&#xff1a;指针不指南吗 专栏&#xff1a;Acwing 蓝桥集训每日一题 &#x1f43e;做题过程中首先应该注意时间复杂度问题&#x1f43e; 文章目录1.改变数组元素2.差分3.差分矩阵1.改变数组元素 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操…...

Spring Boot最核心的27个注解,你了解多少?

https://blog.csdn.net/ManuMAX/article/details/129017443 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架&#xff0c;它不仅可以方便地创建生产级的Spring应用程序&#xff0c;还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成…...

css3弹性盒子

弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。 弹性容器通过设置 display 属性的值为 flex 或 inline-flex将其定义为弹性容器。 弹性容器内包含了一个或多个弹性子元素。 display:flex; 修改排列方式: 0. direction: rtl; //(right-to-left),弹性子元素的…...

数据分析与SAS学习笔记2

SAS在企业使用的情况&#xff1a; SAS是一个很昂贵的商业软件。在企业中使用SAS比较多&#xff0c;在企业界中是比较流行&#xff0c;在学术界使用R比较多。 SAS简介&#xff1a;统计分析系统 处理生物分析数据。 SAS成为统计领域的国际标准软件&#xff0c;服务全球50000多家…...

零信任-Akamai零信任介绍(6)

​Akamai零信任介绍 Akamai是一家专注于分布式网络服务的公司&#xff0c;它提供了一系列的互联网内容和应用加速服务。关于Akamai的零信任&#xff0c;它指的是Akamai的安全架构中不存在任何一个环节是可以被单独的控制或影响的&#xff0c;因此可以提供更高的安全性。通过使…...

表现良好的最长时段[前缀和思想子数组]

前缀和与最长子数组前言一、表现良好的最长时间段二、前缀和思想&子数组1、前缀和&map2、前缀和&单调栈总结参考文献前言 对于子数组/子串问题&#xff0c;紧密连续前缀和/滑动窗口/单调栈&#xff1b;挖掘内在规律&#xff0c;可以简化代码&#xff0c;降低时空复…...

Python 获取当前系统时间

在有的时候&#xff0c;系统不能联网&#xff0c;需要获取系统的当前实现&#xff0c;此时需要python的datetime库。 一、使用方法 1. 导入库&#xff1a;import datetime 2.获取当前日期和时间&#xff1a;now_time datetime.datetime.now() 3.格式化成我们想要的格式&am…...

pytorch基础入门教程

pytorch基础入门教程 Pytorch一小时入门教程 前言 机器学习的门槛并没有想象中那么高&#xff0c;我会陆续把我在学习过程中看过的一些文章和写过的代码以博客的形式分享给大家&#xff0c;和大家一起交流&#xff0c;这个是本系列的第一篇&#xff0c;pytoch入门教程&#x…...

RTSP协议交互时TCP/UDP的区别 以及视频和音频的区别 以及H264/H265的区别

经过这几天的调试 一个功能简单的 RTSP服务端已经实现了 支持TCP/UDP 支持H264 H265 支持同时传输 AAC音频 记录下 交互时需要注意的地方 1.OPTIONS 都一样 如下&#xff1a;左箭头内是客户端发给服务端 箭头内是服务端回给客户端 2.DESCRIBE 目前的流是包含视频和AAC音频…...

调用大智慧L2接口是什么原理?作用是什么?

有些开发人员想要设计一个微信公众号或者微信小程序&#xff0c;由于自己搭建数据库工作量太大&#xff0c;或者技术受限&#xff0c;也会选择调用大智慧L2接口减少工作量。调用大智慧L2接口是什么原理&#xff1f;作用是什么&#xff1f; 大智慧L2接口即应用程序编程接口&…...

数据结构 - 栈 与 队列 - (java)

前言 本篇介绍栈和队列&#xff0c;了解栈有顺序栈和链式栈&#xff0c;队列底层是双链表实现的&#xff0c;单链表也可以实现队列&#xff0c;栈和队列的相互实现和循环队列&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&a…...

CellularAutomata元胞向量机-8-渗流集群MATLAB代码分享

%% Percolation Clusterclf clc, clearthreshold .63; % ax axes(units,pixels,position,[1 1 650 700],color,k); text(units, pixels, position, [150,255,0],... string,美赛,color,w,fontname,helvetica,fontsize,100) text(units, pixels, position, [40,120,0],... str…...

iOS UI自动化测试详解

前言&#xff1a; 小目标 关于UI自动化的定义&#xff0c;我想要的是自动地按照流程去点击页面、输入数据&#xff0c;不需要人去参与&#xff0c;节省人工时间。比如登录&#xff0c;能够自己去填写用户名&密码&#xff0c;然后点击按钮跳转到下一个页面等。在能够保证业…...

Mybatis源码分析(九)Mybatis的PreparedStatement

文章目录一 JDBC的PreparedStatement二 prepareStatement的准备阶段2.1 获取Connection2.1.1 **UnpooledDataSource**2.1.2 PooledDataSource2.2 Sql的预编译PreparedStatementHandler2.3 为Statement设置参数2.4 执行具体的语句过程官网&#xff1a;mybatis – MyBatis 3 | 简…...

winfrom ui

http://www.iqidi.com/download/warehouse/Device_DotNetBar.rar http://qiosdevsuite.com/Download https://sourceforge.net/projects/qiosdevsuite/ https://www.cnblogs.com/hcyblogs/p/6758381.html https://www.cnblogs.com/jordonin/p/6484366.html MBTiles地图瓦片管…...

中国国家级地面气象站基本气象要素日值数据集(V3.0)

数据集摘要 数据集包含了中国基本气象站、基准气候站、一般气象站在内的主要2474个站点1951年1月以来本站气压、气温、降水量、蒸发量、相对湿度、风向风速、日照时数和0cm地温要素的日值数据。数据量为21.3GB。 (1)SURF_CLI_CHN_MUL_DAY-TEM-12001-201501.TXT 气温数据TEM, 包…...

【Python语言基础】——Python NumPy 数组副本 vs 视图

Python语言基础——Python NumPy 数组副本 vs 视图 文章目录 Python语言基础——Python NumPy 数组副本 vs 视图一、Python NumPy 数组副本 vs 视图一、Python NumPy 数组副本 vs 视图 副本和视图之间的区别 副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...