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

C语言static关键字

目录

  • static修饰局部变量
  • static修饰全局变量
  • static修饰函数

static是C语言的关键字,它有静态的意思
static的三种用法:

  • 修饰局部变量
  • 修饰全局变量
  • 修饰函数

static修饰局部变量

我们先看一个程序:

void print()
{int a = 0;a++;printf("%d\n", a);
}int main()
{int i = 0;while (i < 10){print();i++;}return 0;
}

这个程序会输出10个1,原因是在主函数中每次调用print函数,print函数会输出a的值,但是a是一个局部变量,每次print函数调用结束后a就会被销毁,下次调用的时候还会创建一个a,所以每次打印a的值都是不变的

接下来我么用static修饰a

void print()
{//修饰局部变量static int a = 0;a++;printf("%d\n", a);
}int main()
{int i = 0;while (i < 10){print();i++;}return 0;
}

这次运行程序,结果是打印从1~10
在这里插入图片描述

解释这个原因前,可以先了解一下内存:

内存可以粗口地分为3个区:栈区,堆区,静态区。
栈区存放局部变量、函数形参,堆区存放动态开辟的数据,静态区存放静态变量和全局变量
在这里插入图片描述

接下来解释原因:

普通的局部变量存放到栈区,这种局部变量进入作用域时创建,出作用域后就会被修改

static修饰后的局部变量叫静态变量,这种变量存放到静态区中,而存在静态区中的变量,创建好后,直到程序结束后才会被销毁

本质上:static修饰改变了局部变量在内存中的存储位置,存储位置的改变,使得执行的效果不一样。

所以在上面的程序中,第一次调用print函数是就创建了一个静态变量a,即使在出print函数时这个变量也不会被销毁,仍保存着之前的值。
下一次再调用print函数时,函数中的static int a = 0;自动被跳过,执行下面的对a的值改变的操作

所以最后会打印出1~10


static修饰全局变量

一个全局变量已经有着静态变量的属性了,那为什么还要用static修饰?

其实,static修饰全局变量是用在跨文件的场景中

我们先在tes1函数中定义一个全局变量int num = 10;
如果想要在同项目的A文件中使用这B文件中的全局变量,我们需要在A文件中用关键字extern修饰声明一下这个变量,然后就可以使用了
在这里插入图片描述

如果我们将numstatic修饰会发生什么呢?
在这里插入图片描述
可以看见,用static修饰后报错了

原因是:
全局变量本身就具有外部链接属性,在A文件中定义的全局变量在B文件中是可以通过链接使用

但如果全局变量被static修饰,这个外部链接属性就变为了内部链接属性,这个全局变量只能在自己所在源文件内部使用

static的修饰,会把外部链接属性变为内部链接属性,最终使得全局变量的作用域变小了


static修饰函数

其实static修饰函数是和static修饰全局变量类似的

我们在A源文件中一个函数,想要在B源文件中使用,只需要在B源文件中用extern声明外部函数,就可以在B文件中使用这个函数了

在这里插入图片描述

如果将sum函数用static修饰,会发生什么呢?
在这里插入图片描述
可以看到,也是会报错。

原因和static修饰全局变量相似:
函数本身具有外部链接属性,被static修饰后,外部链接属性变为内部链接属性,使得这个函数只能在自己所在的源文件中使用,其他源文件无法使用

相关文章:

C语言static关键字

目录static修饰局部变量static修饰全局变量static修饰函数static是C语言的关键字&#xff0c;它有静态的意思static的三种用法&#xff1a;修饰局部变量修饰全局变量修饰函数 static修饰局部变量 我们先看一个程序&#xff1a; void print() {int a 0;a;printf("%d\n&…...

【华为OD机试模拟题】用 C++ 实现 - 单词接龙(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…...

PHP基础(2)

PHP基础常用函数数组及多维数组数组遍历强制类型转换运算符赋值与基本运算字符串运算逻辑运算符常用函数 substr的用法是&#xff1a;substr&#xff08;目标字符串&#xff0c;从字符串的哪个位置开始&#xff0c;然后返回往后的几个字符&#xff09;strchr的用法是&#xff1…...

Java8(JDK1.8)新特性

一、Java8(JDK1.8)新特性 1、Lamdba表达式 2、函数式接口 3、方法引用和构造引用 4、Stream API 5、接口中的默认方法和静态方法 6、新时间日期API 7、OPtional 8、其他特性 二、java8&#xff08;JDK1.8&#xff09;新特性简介 1、速度快&#xff1b; 2、代码少、简…...

【C语言】指针的定义和使用

指针一、什么是指针二、指针类型三、指针和数组的关系四、空指针五、野指针一、什么是指针 指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;通过地址直接指向内存中该地址的值。由于通过地址能够找到所需的变量存储单元&#xff0c;可以说地址指向该变…...

Parameter ‘zpspid‘ not found

异常&#xff1a;nested exception is org.apache.ibatis.binding.BindingException: Parameter testypid not found. Available parameters are [ztpsXmjcxx, pageable, param1, param2]分析&#xff1a;以为是xml文件中没有对应的字段&#xff0c;一细看了几遍是有这个字段的…...

23、高自由度下的E类波形理论计算(附Matlab代码)

23、高自由度下的E类波形理论计算&#xff08;附Matlab代码&#xff09; 0、代码 任意占空比、电压导数条件下的E类波形与阻抗条件计算Matlab 注意修改路径&#xff0c;我这边是&#xff1a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#…...

软件测试:用“bug”来表示“在电脑程序里的错误”

计算机基础知识计算机&#xff08;personal computer&#xff09;俗称电脑&#xff08;pc&#xff09;&#xff0c;是现代一种用于高速计算的电子机器&#xff0c;可以进行数值计算&#xff0c;又可以进行逻辑判断&#xff0c;还具有存储记忆功能&#xff0c;且能够按照程序的运…...

Git命令

git init # 初始化本地git仓库&#xff08;创建新仓库&#xff09;git config --global user.name "xxx" # 配置用户名git config --global user.email "xxxxxx.com" # 配置邮件git config --global color.ui true # git status等命令自动着色git config -…...

Java的异常概念和类型

Java是一种流行的编程语言&#xff0c;拥有强大的异常处理机制&#xff0c;以帮助开发人员在程序出现异常时更好地处理错误情况。本文将介绍Java异常的概念和类型。异常的概念在Java中&#xff0c;异常是指在程序运行时发生的错误或异常情况。例如&#xff0c;当程序试图打开不…...

【Leedcode】环形链表必备的面试题和证明题(附图解)

环形链表必备的面试题和证明题&#xff08;附图解&#xff09; 文章目录环形链表必备的面试题和证明题&#xff08;附图解&#xff09;前言一、第一题1.题目2.思路3.代码4.延伸问题(1)证明题一&#xff1a;(2)证明题二&#xff1a;二、第二题1.题目2.思路延伸的证明题总结前言 …...

Vulnhub靶场----7、DC-7

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-7下载地址&#xff1a;https://download.vulnhub.com/dc/DC-7.zip kali&#xff1a;192.168.144.148 DC-7&#xff1a;192.168.144.155 二、渗透流程 nmap -T5 -A -p- -sV -sT 192.168.144.155思路&#xff1a; …...

【Unity VR开发】结合VRTK4.0:创建滑块

语录&#xff1a; 只有经历地狱般的磨练&#xff0c;才能炼出创造天堂的力量。 前言&#xff1a; 滑块是一个非常简单的控件&#xff0c;它允许通过沿有限的驱动轴滑动 Interactable 来选择不同的值。我们将使用线性驱动器创建一个滑块控件&#xff0c;该控件允许我们根据与滑…...

Latex中的表格(2)

Latex中的表格一、一个加脚注的三线表的例子二、表格中加注释三、并排的表格3.1 使用小页环境并排表格3.2 使用子表格并排表格四、一个复杂的表格五、一个长表格这篇文章主要罗列一些特殊的表格例子。内容来自&#xff1a;一篇北师大学位论文模板&#xff0c;详见https://githu…...

(七)输运定理

本文主要内容包括&#xff1a;1. 物质积分2. 曲线上物质积分的时间变化率3. 曲面上物质积分的时间变化率4. 体积域上物质积分的时间变化率 (Reynolds 输运定理)1. 物质积分 考虑 t0t_0t0​ 时刻参考构型中由物质点 X⃗\vec{X}X所形成的 物质曲线 ct0c_{t_0}ct0​​、物质曲面 …...

ABBYYFineReader15免费电脑pdf文档文字识别软件

ABBYYFineReader是一款OCR文字识别软件&#xff0c;它可以对图片、文档等进行扫描识别&#xff0c;并将其转换为可编辑的格式&#xff0c;比如Word、Excel等&#xff0c;操作也是挺方便的。 我们在官网找到该软件并进行下载&#xff0c;打开软件后&#xff0c;选择转换为“Mic…...

顺序表(超详解哦)

全文目录引言顺序表定义静态顺序表动态顺序表动态顺序表的接口实现顺序表的初始化与销毁顺序表尾插/尾删顺序表头插/头删顺序表在pos位置插入/删除顺序表的打印顺序表中的查找总结引言 在生产中&#xff0c;为了方便管理数据&#xff0c;我们经常会需要将一些数据连续的存储起…...

Compose-Animation高级别动画

目录前言AnimatedVisibilityisScrollingUpFABscaffoldanimateContentSizeCrossfade顶部气泡下弹前言 AnimatedVisibility 驱动可视性相关动画&#xff0c;即布局显隐 animateContentSize 内容变换动画相关 Crossfade 布局&#xff08;或者页面&#xff09;切换过渡动画 Animat…...

c++11 标准模板(STL)(std::unordered_set)(八)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

Python每日一练(20230225)

目录 1. 整数反转 2. 求最大公约数和最小公倍数 最大公约数 最小公倍数 3. 单词搜索 II 附录&#xff1a; DFS 深度优先搜索算法 BFS 广度优先搜索算法 BFS 和 DFS 的区别 1. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...