C语言的重要知识点☞static关键字
static译为"静态的",该关键字可以修饰以下内容:
- 修饰局部变量
- 修饰全局变量
- 修饰函数
在讲解static的具体作用前需要先知道"作用域"以及"生命周期"的概念:
作用域:
作用域是一个程序设计概念,通常来说,一段程序代码中用到的名字并不总是有效的(可用)的,而限定这个名字的可用性的代码范围就是这个名字的作用域
大白话讲就是:这个东西在哪块地方可以使用,它的作用域就在哪儿
举个例子:
#include<stdio.h>
void f()
{int tmp=0;tmp++;// 在作用域内有效,可用对其进行操作
}
int main()
{tmp++;// 报错,tmp的作用域只在f函数的范围内,出了作用域就不可用了return 0;
}
作用域范围:
- 局部变量的作用域是变量所在的局部范围(如上面例子中的tmp变量)
- 全局变量的作用域是整个工程(项目)
举一个全局变量的例子:
#include<stdio.h>int a = 0;// 定义在全局
// a = 10;// 全局作用域不能进行赋值语句
void f()
{a = 10;// 可以在任意函数中访问
}
int main()
{f();a++;// 可以在任意函数中访问printf("%d", a);return 0;
}
额外补充一个知识点:C 语言规定,在全局作用域只能进行变量定义和初始化,不能直接执行语句(如 a++;a=10
)。
生命周期:
生命周期指的是变量的创建(申请内存空间)到 变量的销毁(收回内存空间)之间的一个时间段
联系前面说到的作用域,我们知道作用域限定了变量的可用/有效范围,不难想到从本质上看其实就是出了作用域变量就被销毁了,所以就不可用即无效了
生命周期时间段:
- 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束
- 全局变量的生命周期是:整个程序的生命周期
static关键字的作用:
①static修饰局部变量会改变局部变量的生命周期,生命周期会和程序的生命周期一样
来看两段代码:
从上面两段代码的结果不难看出,变量 i 的生命周期在被static修饰后明显发生了改变,原先的生命周期(如代码1所示)只在test()函数中,故每次调用test()函数,就会重新创建一次变量 i ,因为 i 出了函数(作用域)销毁了,所以每次打印的值都是1
但是被static修饰后,打印的结果是累加的,也就是变量 i 的值没有在中途销毁过,也就是出了函数没有被销毁,故重新进入函数就不会重新创建变量 i ,直接用上一次的值进行运算
为什么会这样呢?
因为static修饰变量后,本质上改变了变量的存储类型,本来一个局部变量是存储在内存的"栈区"
但是被static修饰后存储到了静态区,存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。但是作用域不变哦
使用建议:未来一个变量出了函数以后,还想保留值,等下次进入函数继续使用,就可以用static关键字修饰
②static修饰全局变量会使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用
extern关键字用于声明外部符号,如果一个全局的符号在A文件中被定义,在B文件中想被使用,就可以使用extern关键字进行声明,然后就可以使用了
上面的代码,左边的可以正常运行,但是右边的代码编译时会出现链接性错误
这就是static修饰后,使得这个全局变量只能在本源文件中使用,不能在其他源文件使用
为什么会这样呢?
本质原因是全局变量默认是具有外部链接属性的,在外部文件中想要使用,只要适当的声明就可以使用;但是全局变量被static修饰后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了,其他源文件,即使声明了,也是无法正常使用的
使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰
③static修饰函数,和static修饰全局变量的效果是一样的
一个函数在整个工程中都可以使用,如果想在外部源文件使用,一样的加上extern关键字修饰并且在另一个文件中声明就可以了
但是一旦被static关键字修饰后,就只能在本文件内部使用,其他文件无法正常的链接使用了
本质原因也是函数默认具有外部链接属性,具有外部链接属性,使得函数在整个工程中只要适当声明就可以被使用。但是被static修饰后变成了内部链接属性,使得函数只能在自己所在的源文件内部使用
使用建议:如果一个函数,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰
完
相关文章:
C语言的重要知识点☞static关键字
static译为"静态的",该关键字可以修饰以下内容: 修饰局部变量修饰全局变量修饰函数 在讲解static的具体作用前需要先知道"作用域"以及"生命周期"的概念: 作用域: 作用域是一个程序设计概念&#…...
unordered_map和unordered_set的设计
#pragma once #include"HashTable.h" namespace aqc {template<class K,class V,class HashHashFunc<K>>class unordered_map{public:struct MapKeyOfT{const K& operator()(const pair<K, V>& kv)//pair对象是const返回值也得是const{ret…...
Servlet--快速入门及HTTP概述
Servlet概述 Servlet:server applet,是用Java编写的服务器端程序,其主要功能在于交互式的浏览和修改数据,生成动态web内容,一般来说,Servlet是指实现了这个Servlet接口的类 在Java中,Servlet是用于创建动态Web内容的服务器端组件。 Servle…...
【LeetCode Hot100 | 每日刷题】二叉树的层序遍历
题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2&a…...
编码器型与解码器型语言模型的比较
编码器型与解码器型语言模型的比较 1. 引言 自然语言处理(NLP)领域近年来取得了革命性进展,这在很大程度上归功于基于Transformer架构的语言模型。在这一技术生态中,编码器型(Encoder-only)和解码器型&am…...
Java 函数式编程
函数式编程的意义 函数式编程理念强调函数纯粹性和不可变性,这有助于写出更稳定、更易测试的代码,尤其在并发环境下减少 bug lambda 表达式 import java.util.function.Function;public class Strategize {Function<String, String> getString …...
MySQL初阶:基础增删改查(CRUD)
创建(Create) 先创建一个表 1)单独插入一条 insert into 表名 values (列名 类型)...; 插入的记录要和表一开始创建记录的类型,个数,结构一样。 如果不一样,就会报错。…...
yolo训练用的数据集的数据结构
Football Players Detection using YOLOV11 可以在roboflow上标注 Sign in to Roboflow 训练数据集只看这个data.yaml 里面是train的image地址和classnames 每个image一一对应一个label 第一个位是分类,0是classnames[0]对应的物体,现在是cuboid &…...
vue3+ts继续学习
我们再写点东西,这里面都是vue2的语法,应该都能看明白!我们写完直接去运行一下代码! 发现什么都没有发生!为什么呢?因为我们在App.vue中没有引入!哈哈哈哈!这样就好了!注…...
Oracle01-入门
零、文章目录 Oracle01-入门 1、Oracle简介 (1)数据库基础 数据库基础请参考:https://blog.csdn.net/liyou123456789/article/details/131207068 (2)Oracle是什么 ORACLE 数据库系统是美国 ORACLE 公司ÿ…...
即开即用,封装 Flask 项目为 exe 文件实操步骤
见字如面,朋友们! 嗨,这里是 AIGC 创意人_竹相左边! 正如你们所知,我正在通过 AI 自学软硬件工程师,目标是手搓一台可回收火箭玩具! 最近,我被《流浪地球 2》中马兆的那句“没有硬…...
【STM32单片机】#14 PWR电源控制
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 目录 PWR…...
FastComposer论文问题与解决
在FastComposer中,跨注意力定位监督(Cross-Attention Localization Supervision) 的实现是通过以下步骤完成的,核心思想是利用分割掩码约束扩散模型中跨注意力图的分布,确保每个主体的特征仅影响图像中对应的区域。具体…...
51单片机同一个timer 作为定时器和波特率发生器么?
在51单片机中,同一个Timer(定时器)不能同时作为普通定时器和波特率发生器。这是因为这两种功能都需要对Timer的寄存器进行配置和操作,而它们的配置要求是冲突的。具体来说: 1. 普通定时器功能 配置要求:需…...
爱情的本质是什么--deepseek
爱情的本质是一个跨越生物学、心理学、哲学和社会学的复杂命题。不同学科视角下,爱情呈现出多层次的真相,但核心可以归结为: “爱情是进化塑造的生存策略、神经化学的短暂狂欢,以及人类对抗存在孤独的精神创造。” 以下从四个维…...
Leetcode 刷题记录 07 —— 链表
本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答。 01 相交链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* …...
Android View#post()源码分析
文章目录 Android View#post()源码分析概述onCreate和onResume不能获取View的宽高post可以获取View的宽高总结 Android View#post()源码分析 概述 在 Activity 中,在 onCreate() 和 onResume() 中是无法获取 View 的宽高,可以通过 View#post() 获取 Vi…...
dubbo限流
单机限流 限流过滤器 package com.doudou.filter;import org.apache.dubbo.common.URL; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*;import java.util.concurrent.Concu…...
IBM BAW(原BPM升级版)使用教程:基本概念
本部分为“IBM BAW(原BPM升级版)使用教程系列”内容的补充。 一、IBM BAW中的流程概念 在IBM Business Automation Workflow(BAW)中,流程定义是流程设计的核心组成部分,它涵盖了流程的结构、任务、数据流…...
1. 视频基础知识
1. 图像基础概念 像素:像素是一个图片的基本单位,pix是英语单词picture,加上英语单词“元素element”,就得到了pixel,简称px。所以“像素”有“图像元素”之意。分辨率:指的是图像的大小或者尺寸。比如 19…...
docker + K3S + Jenkins + Harbor自动化部署
最近公司在研究自动化部署的一套流程,下面记录一下配置流程 需要提前准备好Jenkins Harbor Git(其他管理工具也可以) 我这里的打包编译流程是Jenkins上配置打包任务-->自动到git目录下找打包文件---->项目编译后打镜像包------>打完镜像包将镜像上传到…...
【算法专题十】哈希表
文章目录 0.哈希表简介1. 两数之和1.1 题目1.2 思路1.3 代码 2.判断是否为字符重排2.1 题目2.2 思路2.3 代码 3. leetcode.217.存在重复元素3.1 题目3.2 思路3.3 代码 4. leetcode.219.存在重复的元素Ⅱ4.1 题目4.2 思路4.3 代码 5. leetcode.49.字母异位词分组5.1 题目5.2 思路…...
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡 一、技术过渡期的必然误解 1.1 兼容性设计的双刃剑效应 鸿蒙系统早期版本的兼容性策略为后续争议埋下了伏笔。2019年华为被列入实体清单后,面临着生死存亡的技术断供危机。在这…...
Nginx 安全防护与 HTTPS 安全部署
目录 Nginx 安全防护与 HTTPS 安全部署 一、引言 二、Nginx 安全防护措施 2.1 关闭不必要的服务和端口 2.2 限制访问频率 2.3 防止 SQL 注入和 XSS 攻击 2.4 隐藏 Nginx 版本信息 三、HTTPS 安全部署 3.1 HTTPS 简介 3.2 申请 SSL/TLS 证书 3.3 配置 Nginx 启用 HTTP…...
告别异步复杂性?JDK 21 虚拟线程让高并发编程重回简单
长期以来,Java 的并发编程主要围绕平台线程(Platform Threads)构建。然而,在现代应用对海量并发的巨大需求面前,传统模型面临着可伸缩性的挑战。JDK 21 引入了一项突破性的特性——虚拟线程(Virtual Thread…...
Marin说PCB之POC电路layout设计仿真案例---08
Layers –stackup: RX1_96724F_FAKRA_1仿真原理图信息如下,设计中采用了6Gbps/187Mbps的速率配置: IL的limited: RL的limited: RX1_96724F_FAKRA_1--Return Loss:结果显示,板级设计裕量不是很充足,很接近限值曲线了。 …...
【Python系列】Python 中的 HTTP 请求处理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【BUG】mmdetection ValueError: need at least one array to concatenate
问题: 使用mmdetection框架使用COCO格式训练自定义数据集时出现如下错误: ValueError: need at least one array to concatenate 解决方法: 修改mmdet/datasets/coco.py文件,将CocoDataset类中的METAINFO修改为自己数据集的类别信…...
GLIBC:GLIBCXX not found
更多内容:XiaoJ的知识星球 目录 1. GLIBCXX not found2.解决方法:(使用预编译库)2.1 获取预编译libstdc库2.2 获取预编译libc库 注意:涉及到修改GLIBC库是个危险操作,可能会影响到系统。请谨慎操作…...
初步认识java
目录 1. java语言概述 1.1 java是什么 1.2 Java语言重要性 1.2.1 语言广泛使用程度 1.2.2 使用领域 1.3 Java语言发展简史 1.4 Java语言的特点 2. Java开发环境安装 2.1 什么是JDK 2.2 什么是JRE 2.3 什么是JVM 2.4 JDK、JRE 和 JVM的包含关系 2.5 JDK的安装和环…...
ShardingJdbc-水平分库
ShardingJdbc-水平分库 水平分库 表结构相同、记录不同、所属库不同多个库中表记录数和才是总的记录数通常根据主键ID进行分表,这里采用奇偶策略 案例 建立库 sharding_demo-1、sharding_demo-2每个库建立表 user_1、user_2 表结构相同id 为主键,big…...
模板模式 VS 建造者模式
模板模式和建造者模式是两种不同的设计模式,下面从定义、结构、应用场景等方面介绍它们的区别,并给出 Python 示例代码。 定义 模板模式:定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。这样,子类可以在…...
模态编码器
1.CLIP的textEncoder能输入多少个单词? CLIP 模型中的 context_length 设置为 77,表示每个输入句子会被 tokenized 成最多 77 个token。这个 77 并不是直接对应到 77 个单词, 因为一个单词可能会被拆分成多个 token,特别是对于较长的或不常…...
Python-map从基础到进阶
无论你是打打算法比赛还是做项目map函数肯定都是你必学内置函数,这篇文章小白也能轻松掌握map函数,学习map,理解map,进阶用法map 描述 map() 函数会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个…...
大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现
文章目录 大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构数据可视化模块设计图后台管理模块设计数据库设计 五、开发技术介绍Flask框架Python爬…...
「Mac畅玩AIGC与多模态21」开发篇17 - 多字段判断与多路径分支工作流示例
一、概述 本篇在结构化输出字段控制流程的基础上,进一步引入多字段联合判断与多路径分支控制。通过综合分析用户输入的情绪类型和紧急程度,实现三分支路径执行逻辑,开发人员将掌握复杂流程中多条件判断节点的配置技巧。 二、环境准备 macO…...
网页截图指南
截取网页截图看似是一项简单的任务,但当你真正动手去做的时候,就会发现事情远没有那么容易。我在尝试截取一篇很长的 Reddit 帖子时就深有体会。一开始我以为只要调用 browser.TakeImage() 就万事大吉,结果却陷入了浏览器视口、动态内容加载、…...
作为主动唤醒的节点,ECU上电如何请求通讯
一个ECU如果作为主动唤醒的节点,ECU上电时可以通过以下方式请求通信 如上图所示,ECU在上电后,在OS起来后,可以通过在BSWM模块中完成NvM_ReadAll和相关BSW 模块初始化以及Rte_Start后,这个时候周期性Task已经可以正常调…...
应用服务器Tomcat
启动两给tomcat apache-tomcat-9.0.60\bin——> 启动tomcat startup.bat (Windows) / startup.sh(Linux) 关闭tomcat shutdown.bat(Windows)/shutdown.sh (Linux) 复制一个Tomcat为2,先启…...
【安全】端口保护技术--端口敲门和单包授权
【安全】端口保护技术--端口敲门和单包授权 备注一、端口保护二、端口敲门三、单包授权 备注 2025/05/06 星期二 最近学习了端口保护技术总结一下 一、端口保护 为了保护联网设备的安全,一般会尽量减小暴露的攻击面,开放的端口就是最常见的攻击面&…...
金升阳科技:配套AC/DC砖类电源的高性能滤波器
金升阳推出的FC-L15HB是为我司AC砖类电源配套使用的EMC辅助器。将FC-L15HB加装在金升阳AC/DC砖类电源的前端,可以提高电源产品IEC/EN61000—4系列及CISPR32/EN55032标准的EMC性能。 01 产品优势 (1)高共差模插入损耗 ①DM&CM࿱…...
浅谈 - GPTQ为啥按列量化
前言 曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望AI的璀璨星空,心潮澎湃,步履不停!愿你我皆乘风破浪,逐梦星辰! 先说结论 GPTQ 按列量化 W,…...
引用第三方自定义组件——微信小程序学习笔记
1. 使用 npm 安装第三方包 1.1 下载安装Node.js 工具 下载地址:Node.js — Download Node.js 1.2 安装 npm 包 在项目空白处右键弹出菜单,选择“在外部终端窗口打开”,打开命令行工具,输入以下指令: 1> 初始化:…...
解决android studio 中gradle 出现task list not built
点击 file 选择settings...
UE5 材质淡入淡出
混合模式选择半透明,灯光照明模式选择Surface TranslucencyVolume...
如何用Java读取PDF
在本文中,我将向您展示如何使用JPedal(一个用于转换、打印、查看PDF文件的Java库)在Java中读取PDF。 如何在Java中读取PDF文件 • 将JPedal添加到您的类或模块路径中(下载试用版jar包)。 • 使用JPedal库中的&q…...
tinyrenderer笔记(中)
tinyrenderer个人代码仓库:tinyrenderer个人练习代码 前言 原教程的第 4 课与第 5 课主要介绍了坐标变换的一些知识点,但这一篇文章的内容主要是手动构建 MVP 矩阵,LookAt 矩阵以及原教程涉及到的一些知识点,不是从一个图形学小白…...
人工智能对人类的影响
人工智能对人类的影响 近年来,人工智能(AI)技术以惊人的速度发展,深刻改变了人类社会的方方面面。从医疗、教育到交通、制造业,AI的应用正在重塑我们的生活方式。然而,这一技术革命也带来了机遇与挑战并存…...
LeetCode 220 存在重复元素 III 题解
LeetCode 220 存在重复元素 III 题解 题目描述 给定一个整数数组 nums 和两个整数 k 和 t,请判断数组中是否存在两个不同的索引 i 和 j,使得: abs(nums[i] - nums[j]) < tabs(i - j) < k 方法思路:桶排序 滑动窗口 核…...
0506--01-DA
36. 单选题 在娱乐方式多元化的今天,“ ”是不少人(特别是中青年群体)对待戏曲的态度。这里面固然存在 的偏见、难以静下心来欣赏戏曲之美等因素,却也有另一个无法回避的原因:一些戏曲虽然与观众…...