1- 关键字static

news2024/12/22 10:55:41

文章目录

  • 1 前言
  • 2 static修饰局部变量
    • 2.1 局部变量无static修饰
    • 2.2 局部变量有static修饰
  • 3 static修饰全局变量

1 前言

在C语言中,static是用来修饰变量和函数的:

  1. 修饰局部变量 - 称为静态局部变量
  2. 修饰全局变量 - 称为静态全局变量
  3. 修饰函数 - 称为静态函数

2 static修饰局部变量

2.1 局部变量无static修饰

局部变量是指在函数或代码块内部声明的变量,其特点是:

  1. 存储位置:局部变量通常存储在栈上;
  2. 初始化:局部变量在声明时,如果没有显式初始化,它的值是随机的;
  3. 生命周期:局部变量在函数或代码块执行时被创建,当执行结束后被销毁;
  4. 作用域:局部变量只能在其所在的函数或代码块内使用。

示例代码如下所示:

void test() {
   //
   int a = 1;
   //
   a++;
   //
   printf("%d ", a);
   //
   return;
}

int main()
{
   //
   int i = 0;
   //
   while (i < 10) {
      test();
      i++;
   }
   //
   printf("\n");
   //
   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析如下:

  1. 变量a是定义在test()函数中的局部变量,其作用域test()函数内部;当test()函数被调用时,变量a创建并初始化为2,当test()函数调用结束后,变量a被销毁;
  2. 在VS2019开发环境下,通过F11调试时会发现,变量a在调用test()函数时反复被创建。

2.2 局部变量有static修饰

当使用关键字static修饰局部变量时,局部变量的初始化、作用域、生命周期和存储位置都会发生变化:

  1. 存储位置:静态局部变量存储在静态存储区,而不是栈上;
  2. 初始化:静态局部变量在声明时,如果没有显式初始化,会被自动初始化为零(对于基本数据类型);如果有明确的初始化值,在第一次调用该函数时,会被初始化为指定的值,在后续的函数调用中,静态局部变量保持上次函数调用后的值,而不会被重新初始化;
  3. 生命周期:静态局部变量在程序开始运行时被创建,在程序结束运行时被销毁,在程序的整个运行期间都存在,其生命周期与程序的整个运行周期相同;
  4. 作用域:静态局部变量的作用域仍然局限于定义它的函数内部,外部函数无法访问这个变量;

示例代码如下所示:

void test() {
   //
   static int a = 1;
   //
   a++;
   //
   printf("%d ", a);
   //
   return;
}

int main()
{
   //
   int i = 0;
   //
   while (i < 10) {
      test();
      i++;
   }
   //
   printf("\n");
   //
   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述
代码及运行结果分析如下:

  1. 当有static修饰时,变量a变成静态局部变量,在调用test()函数并未重新创建和初始化。

3 static修饰全局变量

全局变量是指在所有函数外部声明的变量,其特点是:

  1. 存储位置:全局变量通常存储在静态区;
  2. 生命周期:全局变量在程序开始运行时被创建,在程序结束运行时被销毁,在程序的整个运行期间都存在;
  3. 作用域:全局变量可以在程序的所有函数中被访问和修改。

示例代码如下所示:

  1. 文件1
int main()
{
   //
   printf("g_val = %d\n", g_val);
   //
   return 0;
}
  1. 文件2
int g_val = 2024;

运行程序会提示错误,内容如下所示:

error C2065: “g_val”: 未声明的标识符

解决方法 在文件1中使用extern关键字引用文件2中声明的全局变量g_val,代码如下所示:

extern int g_val;

int main()
{
   //
   printf("g_val = %d\n", g_val);
   //
   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析如下:

  1. 代码运行正常;
  2. 全局变量具有外部链接属性,这意味着它们可以在多个文件之间共享和访问;
  3. 当在一个源文件中引用另一个源文件中声明的全局变量,需要使用extern关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django空巢老人志愿服务系统-计算机毕业设计源码58726

摘 要 随着社会老龄化问题日益突出&#xff0c;空巢老人群体的关注和关怀日益重要。本研究设计并实现了基于Python的空巢老人志愿服务系统&#xff0c;旨在利用技术手段提供更多关爱和支持给空巢老人群体。 该系统结合Python编程语言的灵活性和易用性&#xff0c;实现了慈善捐赠…

HCIE杭州考试分享

考试过程&#xff1a; 首先提醒大家关注一下天气&#xff0c;我去杭州没看天气&#xff0c;去了一直下雨&#xff0c;鞋子也湿了&#xff1b;27号早上七点多到的杭州&#xff0c;雨一直下&#xff0c;去了直奔网吧上机&#xff0c;最后的机时&#xff0c;早饭和晚饭都在网吧吃…

Linux多线程间通信机制(互斥锁、条件变量、信号量,读写锁)同步与异步(二)

原文链接&#xff1a;https://blog.csdn.net/weixin_55796564/article/details/119699146 一、概述 本章介绍了线程同步的几种不同的方法&#xff0c;包括互斥锁、条件变量、自旋锁以及读写锁&#xff0c;当然&#xff0c;除此之外&#xff0c;线程同步的方法其实还有很多&…

如何获取设备消息?

一、什么是消息&#xff1f; 消息是设备向萤石云平台传输的带有特定内容的信息&#xff0c;大部分消息由设备端主动产生&#xff0c;并且上报到平台。举个例子&#xff0c;设备开启画面变化检测&#xff0c;当设备画面产生变化&#xff0c;设备就会产生报警&#xff08;画面…

Adobe Premiere Pro 2023-23.6.7.1 解锁版下载与安装教程 (一款专业的视频编辑软件)

前言 Adobe Premiere Pro&#xff08;简称PR&#xff09;是一款知名的专业视频编辑软件&#xff0c;数字视频剪辑软件。主要用来编辑视频和音频&#xff0c;可以在RGB和YUV色彩空间中以高达32位色彩的视频分辨率对4K和更高质量的视频文件进行编辑&#xff0c;支持VST音频插件和…

windows 10/11禁用更新

一、操作 获取“禁用更新”文件。将“禁用更新”文件从百度网盘中下载到电脑桌面。 百度网盘:链接:https://pan.baidu.com/s/1eGEtJYgN3MR4qGoUpnP7xw?pwd=ccrc提取码:ccrc 双击运行“禁用更新”。 弹出如下对话框,点击“是”。 弹出如下对话框,点击“是”。 确…

中仕公考:大四还没毕业能考公吗?

应届大学生是否可以报考公务员? 对于尚未获得毕业证书的应届大学生&#xff0c;有资格报名参与公务员考试。具体到学历和学位的要求&#xff0c;截止日期定于2024年7月底。在报名过程中&#xff0c;考生必须填写《报名登记表》和《报名推荐表》&#xff0c;确保提供的信息真实…

【手眼标定】使用kalibr对imu和双目摄像头进行联合标定

使用kalibr对imu和双目摄像头进行联合标定 前言 方式一&#xff1a;ros2消息格式通过ros1_bridge转为ros1消息格式&#xff0c;在ros1环境下录制bag进行标定。一、IMU标定二、双目摄像头标定三、手眼标定&#xff08;imu和双目摄像头的联合标定&#xff09; 方式二&#xff1a;…

Python轻量级 NoSQL 数据库之tinydb使用详解

概要 在现代应用开发中,使用数据库来存储和管理数据是非常常见的需求。对于简单的数据存储需求,关系型数据库可能显得过于复杂。TinyDB 是一个纯 Python 实现的轻量级 NoSQL 数据库,专为嵌入式场景设计,适用于小型项目、原型开发和教学等场景。本文将详细介绍 TinyDB 库,…

SPAW7000高精度功率分析记录仪,测试方案

测试目标 评估双电机四驱系统中前后电机的性能。 分析前后电机之间的实时联动情况。 测量并分析电机控制器的输入与输出功率。 计算功率转换效率和损耗。 验证电机系统的谐波特性。 测试设备 SPAW7000高精度功率分析记录仪&#xff1a;用于测量功率、电压、电流等参数&am…

这个tiktok短视频才发布了一天,就能卖货1.6w美金

这个tiktok短视频才发布了一天&#xff0c;就能卖货1.6w美金&#xff01; 今天的讨论课上&#xff0c; 我的学员们问我 TikTok上的一条带货短视频的结构是怎样的&#xff1f; 我们一起看了这个案例。 一、案例分析 这是TikTok上的一位达人“moreco1in" 他拥有862K粉丝…

LeetCode.3152.特殊数组II

题目描述&#xff1a; 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助你检查 子数组 nums[fromi..toi…

【Linux】多线程7——线程池

1.线程池的概念 1.1.池化技术 池化技术指的是提前准备一些资源&#xff0c;在需要时可以重复使用这些预先准备的资源。 在系统开发过程中&#xff0c;我们经常会用到池化技术。通俗的讲&#xff0c;池化技术就是&#xff1a;把一些资源预先分配好&#xff0c;组织到对象池中…

idea Spring-boot 项目debug启动过慢 :已验证

问题描述 Springboot项目在Idea中开发&#xff0c;server模型启动正常&#xff0c;但debug模式启动非常缓慢。 解决方案&#xff1a; 检查了项目配置&#xff0c;均没有问题&#xff0c;等20分钟以上能正常启动&#xff0c;但这样无法调试。查很多资料都没有找到问题解决方案…

spring01-spring容器启动过程分析

【README】 本文总结自《spring揭秘》&#xff0c;作者王福强&#xff0c;非常棒的一本书&#xff0c;墙裂推荐&#xff1b; spring容器根据配置元素组装可用系统分2个阶段&#xff0c;包括spring容器启动&#xff0c; springbean实例化阶段&#xff1b; 本文详细分析spring容…

Java项目通过IDEA远程debug调试

前言 在我们真实项目开发过程中&#xff0c;又是经常会发现一种问题&#xff0c;就是我们在开发环境功能是正常的&#xff0c;在测试环境可能也不太容易发现问题。 结果到了生产环境&#xff0c;由于数据量大&#xff0c;且数据类型变多后&#xff0c;就产生了一些比较难复现…

创客匠人对话(下):普通人做心理学IP为何如此成功?

老蒋创客圈第63期对话标杆直播连麦&#xff0c;我们邀请到【惢众身心成长家园平台】王辉老师。在上篇文章中&#xff0c;我们着重分享了王辉老师如何通过原有客源造流量&#xff0c;引爆大事件发售的核心秘籍。 本篇文章我们将继续分享对话精彩内容&#xff0c;深度剖析王辉老…

python两大编程思想,类和对象,实例变量类变量,静态方法与实例方法和类方法,给对象动态绑定属性和函数

1.两大编程思想 面向对象&#xff08;python和java&#xff09;和面向过程&#xff08;c语言&#xff09;编程思想的区别 2.类和对象 1.类是抽出对象中的相似属性和行为得到的类别 python中一切皆对象 对于字符串&#xff0c;整数等等都是类型class 可以自定义class&#x…

海康相机二次开发学习笔记2-方案的相关操作

方案和流程是VisionMaster(简称VM)的主要概念,一个方案可以包含多个流程,一个流程可以由多个模块通过连线建立逻辑关系. 方案的相关操作 1. 界面设计 界面分为三个部分:流程显示区,方案操作区,消息显示区.添加GroupBox,文本框,文本,和一些按钮. 2. 流程显示区 为了将方案加…

基于Spring Boot的可盈保险合同管理系统的设计与实现

TOC springboot146基于Spring Boot的可盈保险合同管理系统的设计与实现 绪论** 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关…