C语言关键字之Static

       在一些.C文件中,总能看到static的字样,static作为关键字在 C 和 C++ 中具有重要的作用。它提供了多种使用方式,帮助程序员控制变量和函数的作用域和生命周期。以下是详细介绍。

1. 静态变量

1.1 在函数内部的静态变量

       当一个变量被声明为“static”局部变量时,它的作用域仅限于声明它的函数内部,但它的生命周期却延续到程序终止。这意味着即使函数多次被调用,“static”局部变量也只会被初始化一次,其值会在函数调用之间保持不变。

#include <stdio.h>void incrementCounter() {static int counter = 0; // 静态变量counter++;printf("Counter: %d\n", counter);
}int main() {incrementCounter(); // 输出: Counter: 1incrementCounter(); // 输出: Counter: 2incrementCounter(); // 输出: Counter: 3return 0;
}

解释

  • counter 是一个静态变量,初始化为 0

  • 每次调用 incrementCounter 时,counter 的值都会增加,保持其状态。

1.2 在全局作用域的静态变量

       当一个变量被声明为“static”全局变量时,它的作用域仅限于声明它的文件(源文件)内部,其他文件无法访问这个变量。 这可以用来隐藏一些不希望被其他文件访问的全局变量。

#include <stdio.h>static int globalCounter = 0; // 全局静态变量void incrementGlobalCounter() {globalCounter++;
}void printGlobalCounter() {printf("Global Counter: %d\n", globalCounter);
}int main() {incrementGlobalCounter();incrementGlobalCounter();printGlobalCounter(); // 输出: Global Counter: 2return 0;
}

解释

  • globalCounter 是一个全局静态变量,仅在该文件内部可见。

  • 其他文件无法访问 globalCounter,这有助于避免命名冲突。

       那么,问题来了

       Q:如何在另外一个.c文件中访问全局静态变量?

       A:使用extern 关键字,如下例程。

// file1.c
static int secret_value = 42; // 静态全局变量void print_secret_value() 
{printf("Secret value: %d\n", secret_value);
}// file2.c
extern void print_secret_value(); // 函数声明int main() 
{print_secret_value(); // 可以访问 secret_valuereturn 0;
}

解释

  • 使用 static 关键字定义的变量(如 secret_value)具有文件内部链接性,意味着该变量只能在定义它的文件中使用,无法被其他文件访问。

  • 通过 extern 声明,其他文件可以调用定义在 file1.c 中的函数 print_secret_value,从而间接访问 secret_value 的值。这种设计有助于隐藏内部实现细节,提供良好的封装性。

2. 静态函数(static function)

        当一个函数被声明为 "static"函数时,它的作用域仅限于声明它的文件(源文件)内部,其他文件无法访问这个函数。 这可以用来隐藏一些不希望被其他文件调用的辅助函数。

// file1.c
static int calculate_sum(int a, int b) 
{ // 静态函数return a + b;
}int get_result() 
{return calculate_sum(10, 20);
}// file2.c
int main() 
{calculate_sum(10, 20); // 编译错误,calculate_sum 是静态函数return 0;
}

解释

  • calculate_sum 是一个静态函数,只能在当前文件中使用。

  • 试图在mian 函数中直接调用 calculate_sum将导致编译错误。

3. 静态数组

       静态数组的大小在编译时已确定,并且它的生命周期贯穿整个程序运行期。

#include <stdio.h>void storeValues() {static int values[5]; // 静态数组static int index = 0;if (index < 5) {values[index] = index * 10; // 存储值index++;}for (int i = 0; i < index; i++) {printf("Value[%d]: %d\n", i, values[i]);}
}int main() {storeValues(); // 输出: Value[0]: 0storeValues(); // 输出: Value[0]: 0, Value[1]: 10storeValues(); // 输出: Value[0]: 0, Value[1]: 10, Value[2]: 20storeValues(); // 输出: Value[0]: 0, Value[1]: 10, Value[2]: 20, Value[3]: 30storeValues(); // 输出: Value[0]: 0, Value[1]: 10, Value[2]: 20, Value[3]: 30, Value[4]: 40return 0;
}

解释

  • values是一个静态数组,生命周期贯穿整个程序运行期。

  • 数组在每次调用 storeValues 时保持其状态。 

4. 静态类成员变量/函数

       在 C++ 中,当一个类成员变量或函数被声明为“static” 时,它不属于任何类的实例,而是属于整个类本身。这意味着静态成员可以在没有创建类实例的情况下访问和使用。

class MyClass {public:static int class_count;MyClass() {class_count++;}~MyClass() {class_count--;}};int MyClass::class_count = 0; // 静态成员变量初始化int main() {std::cout << "Class count: " << MyClass::class_count << std::endl; // 0MyClass obj1, obj2, obj3;std::cout << "Class count: " << MyClass::class_count << std::endl; // 3return 0;}

5.总结

       总的来说,“static”关键字在 C 和 C++ 中提供了多种使用方式,可以帮助程序员控制变量和函数的作用域和生命周期,从而编写出更加可维护和高效的代码。

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

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

相关文章

ssl 协议工作过程

ssl 协议工作过程 ChatGPT 说&#xff1a; ChatGPT SSL&#xff08;Secure Sockets Layer&#xff09;协议是用来确保网络通信安全的加密协议&#xff0c;已被TLS&#xff08;Transport Layer Security&#xff09;取代&#xff0c;但它的工作过程仍然是理解现代加密协议的重…

MySQL索引优化与B+树【后端 14】

MySQL索引优化与B树 在MySQL数据库中&#xff0c;索引是优化查询性能的关键技术之一。B树作为一种广泛使用的索引结构&#xff0c;在MySQL的InnoDB存储引擎中扮演着核心角色。本文将详细介绍B树的结构特点及其在MySQL索引优化中的应用。 B树的结构特点 B树是B-树的一个变体&a…

Linux通过特定端口查看服务是否启动

Linux通过特定端口查看服务是否启动 你可以使用netstat或ss命令来检查特定端口上的服务。例如&#xff0c;使用ss -tuln | grep <端口号>来查看端口是否被占用。 netstat 你可以使用以下命令来查看特定端口上的服务&#xff1a; netstat -tuln | grep <端口号>…

uni-app怎么使用uni-icons

首先在官网&#xff08;uni-icons 图标 | uni-app官网&#xff09;中找到下载地址 uni-icons 图标 - DCloud 插件市场 把这个插件下载下来。目录结构是这样的。我们找到uni_modules 把里面的uni-icons粘贴到自己的项目中 我是放在了我的components下面了 然后再页面中引用这个…

血缘解析<二>:如何解析带CTE语句的Sql

blood 一、思路二、代码 一、思路 之前文章血缘解析介绍了血缘解析的思路,但是对于带CTE语句的sql解析不到 eg: with tmp as (select id,name,agefrom personinfo ),tmp1 as (select a.id,a.name,a.age,b.classnofrom tmp ajoin classinfo bon a.id b.id )select id,name,ag…

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询&#xff0c;包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求&#xff0c;选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…

Rust程序结构与代码注释

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 3.1 Rust程序结构 我们从一个最简单的程序入手&#xff0c;来观察一个Rust的程序结…

宏任务微任务题目

常见宏任务&#xff1a;setTimeout、setInterval、requestAnimationFrame、I/O 操作、script&#xff08;整体代码&#xff09; 微任务&#xff1a;Promise.then()、MutationObserver、process.nextTick&#xff08;在 Node.js 中&#xff09; 在执行完一个宏任务后&#xff…

关于前端知识中框架概念部分的详细介绍

1、为什么要学习流行框架&#xff1f; 企业&#xff1a;为了提高效率&#xff0c;因为时间就是金钱。开发人员&#xff1a;提高了开发效率发展进程&#xff1a; JS>JQuery>模板引擎>框架时代&#xff08;Angular(2)、React、Vue&#xff09;好处&#xff1a;不用直接…

揭秘蛇形机器人的主动SLAM算法和障碍物避让策略

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;An active SLAM with multi-sensor fusion for snake robots based on deep reinforcement learning 作者&#xff1a;Xin Liu, Shuhuan Wen, Yaohua Hu, Fei Han, Hong…

文件IO编程

文章目录 文件描述符相关系统调用文件有关的系统调用文件操作函数--creat函数文件操作函数--open函数文件操作函数--read函数文件操作函数--write函数文件操作函数--close函数文件操作函数--lseek函数缓冲区的大小对性能的影响 实验&#xff1a;调用系统函数&#xff0c;实现文…

STM32 WDG看门狗

在大型项目中&#xff0c;BUG根本无法避免&#xff0c;因为可能的状态太多了&#xff0c;总有那么意想不到的情况发生&#xff0c; 所以&#xff0c;对于程序员&#xff0c;第一要要丰富的经验&#xff0c;避免一些常见的bug&#xff0c; 第二&#xff0c;程序要经常迭代&#…

集成学习(Ensembling Learning)

0. 来源 概念比较全&#xff0c;可以作为目录&#xff0c;前置知识讲得好&#xff0c;其他一般。 01.内容简介_哔哩哔哩_bilibili01.内容简介是集成学习&#xff1a;XGBoost, lightGBM的第1集视频&#xff0c;该合集共计19集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

【数据结构】排序算法系列——序言(附源码+图解)

作为基础算法的中流砥柱部分&#xff0c;排序算法一直都是计算机学习者们不可忽略的一部分。而其中的算法思想也蕴含着许多在今后的算法学习甚至是整个计算机技术的学习之中仍然熠熠生辉的算法思想&#xff0c;它们引领着我们不断探索算法的奥秘之处。所以&#xff0c;学习排序…

简单聊聊bait文件

场景&#xff1a;业务同事发现某云主机部署了企业主机安全&#xff0c;在该主机上发现了一个诱饵文件&#xff0c;显示注意&#xff1a;此文件是诱饵文件&#xff0c;用于防止重要文件被病毒加密。请勿修改或删除此文件。 解决方法&#xff1a;联系企业主机安全运维同事发现&am…

信号保存和处理

把上一篇回顾一下吧&#xff1a;共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存的数据结构&#xff1a; struct shmid_ds {…

QT实现TCP/UDP通信

服务器端&#xff1a; 客户端&#xff1a; 服务器&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug&…

point transformer v3复现及核心代码详解

point transformer v3复现及核心代码详解 1. 复现1.1 复现1.2 数据预处理1.3 跑通 2. 核心代码详解2.1 读取数据2.2 dataloder2.3 模型读取数据的逻辑2.4 forward2.4.1 Point2.4.2 backbone2.4.2.1 point.serialization2.4.2.2 稀疏化2.4.2.3 embedding2.4.2.4 encoder 1. 复现…

Emlog程序屏蔽用户IP拉黑名单插件

插件介绍 在很多时候我们需要得到用户的真实IP地址&#xff0c;例如&#xff0c;日志记录&#xff0c;地理定位&#xff0c;将用户信息&#xff0c;网站数据分析等,其实获取IP地址很简单&#xff0c;感兴趣的可以参考一下。 今天给大家带来舍力写的emlog插件&#xff1a;屏蔽…

wakenet尾迹

1、数据集介绍SWIM_Dataset_1.0.0 1.1标注文件介绍 标注文件介绍&#xff0c; 第一种&#xff1a;角度和框的坐标 <annotation><folder>Positive</folder><filename>00001</filename>文件名字<format>jpg</format>图片后缀<s…