【C语言】static关键字用法

server/2024/10/18 20:19:51/

目录

一、static修饰局部变量

二、static修饰全局变量

三、static修饰函数


一、static修饰局部变量

首先我们来看两段代码:

  • 代码1(不加static)
#include <stdio.h>
void test()
{int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 5; i++){test();}return 0;
}

运行结果如下:

  • 代码2(加static)
#include <stdio.h>
void test()
{static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 5; i++){test();}return 0;
}

运行结果如下:

对比以上两段代码,我们发现:

  • 代码1:运行结果分析可知,test函数的局部变量i在每次进入test函数的时候都会重新创建并赋值为0,出函数的时候销毁。
  • 代码2:运行结果可知,被static修饰过后的i,它的值是有累加效果的,在头一次进入test函数后,创建了i后,出函数是不会被销毁的。再次进入函数也不会重新创建变量,而是累积上次的数值继续计算。

出现结果2的原因:

  1. static修饰局部变量的时候,局部变量出了作用域是不会被销毁的。
  2. 不被销毁的原因是:static修饰的局部变量,本质上是改变了变量的存储位置。
  3. 存储位置的改变,实质上影响了变量的生命周期,生命周期变得跟程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。
  4. 但是变量i的作用域是不变的

由上图可知:

  • 栈区的数据特点是:进作用域创建,出作用域销毁。
  • static修饰之后叫静态变量,静态变量是存放在静态区的,放在静态区的数据出了它的作用域不销毁,只有在整个程序结束的时候跟着一起销毁。
  • 一旦变量创建之后,在整个程序执行过程中,它是不会换位置的,不会重新开辟空间。只不过本来在栈区,static修饰就在静态区。

使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static。

二、static修饰全局变量

全局变量的作用域是整个工程,它可以在另外源文件内部使用。

如下:

当用static修饰全局变量时,则会报错。如下:

出现错误的原因:

  1. 一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
  2. 本质原因是全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以。
  3. 当static修饰全局变量时,外部链接属性就变成了内部链接属性,其他源文件(.c)即使声明了,也不能使用这个全局变量。
  4. 但是这个全局变量可以在自己的源文件中正常使用,比如在它自己的add.c文件就可正常使用。

使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。

三、static修饰函数

我们先看一下下面两段代码

代码1(不加static)

该位置能够调用函数是因为:函数也默认具有外部链接属性,只要适当声明,就可以在整个工程都使用

代码2(加static)

可以发现,当函数被static修饰之后,就发生了链接错误。

原因:

如果一个函数被static修饰,外部链接属性就变成了内部链接属性,其它源文件(.c)就不能再使用该函数,只能在自己所在的源文件内部使用。

使用建议:一个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用static来修饰。


http://www.ppmy.cn/server/38490.html

相关文章

视频封面一键提取:从指定时长中轻松获取您想要的帧图片

在数字媒体时代&#xff0c;视频已成为人们获取信息、娱乐和沟通的主要形式之一。而一个好的视频封面&#xff0c;往往能够吸引观众的眼球&#xff0c;增加视频的点击率和观看量。然而&#xff0c;对于很多视频创作者和编辑者来说&#xff0c;如何从视频中快速、准确地提取出合…

浅谈C++ overload(重载) override(覆盖) overwrite(重写)

目录 1. 名词辨析2 含义解析1 overload重载2 override覆盖3 overwrite重写 3 区别4 代码示例 1. 名词辨析 关于这3个名词的中文翻译&#xff1a; overload翻译为重载&#xff0c;基本是没有歧义的&#xff1b;override和overwrite的翻译&#xff0c;我在参考了cppreference中…

数据库——实验10 数据库的安全性

1. 安全认证模式 SQL Server有两种身份认证模式&#xff1a;Windows 认证模式和混合认证模式(即 Windows 身份验证和 SQL Server 身份验证)。 (1)仅 Windows 认证模式&#xff1a;这是 SQL Server 2005 的默认身份验证模式&#xff0c;适用于所有登录者均为 Windows 200…

(类)偏特化Partial Specialization

当编写一个模板特化&#xff0c;涉及部分但不是全部模板参数时&#xff0c;它被称为偏特化&#xff08;Partial Specialization&#xff09;。【注意&#xff0c;偏特化是针对类模板而言&#xff0c;函数模板不可偏特化&#xff0c;只能全特化】 偏特化是C模板编程中的一种技术…

【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】

HTMLCSS家乡河南主题网页目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、页面效果Page1 首页Page2 开封游玩Page 3 开封美食Page4 留言 &#x1f308; 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 &#x1f40b;四…

linux开发笔记(F1C200S)折腾weston桌面

参考文章&#xff1a; 1、嵌入式桌面&#xff08;1&#xff09;——weston桌面_qt weston-CSDN博客 2、https://blog.51cto.com/u_16213414/9171009 3、weston.ini: configuration file for Weston — the reference Wayland compositor | weston File Formats | Man Pages …

设置默认表空间和重命名

目录 设置默认表空间 创建的临时表空间 tspace4 修改为默认临时表空间 创建的永久性表空间 tspace3 修改为默认永久表空间 重命名表空间 将表空间 tspace3 修改为 tspace3_1 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/13520…

7天精通Web APIs——-Bom操作(理论+实战)(第五天)

一、window对象 1.1 window对象和bom的关系 首先理解dom和bom之间的关系 显然bom的范围比较大 bom的全称为浏览器对象模型 window是bom的核心对象&#xff0c;window里面有很多属性和方法&#xff0c;用于实现浏览器与 JavaScript 代码之间的交互。作为 JavaScript 的全局对…