C语言基础-静态变量(static)

在C语言中,static关键字有多种用途,主要与变量的存储期(lifetime)和可见性(visibility)有关。以下是static在C语言中的主要用途:

  1. 局部静态变量

    • 在函数内部定义的局部静态变量,它的存储期是整个程序的执行期间,而不是仅仅在函数被调用时。这意味着,即使函数执行结束,该变量的值也不会丢失,它会在下次函数调用时保持其值。
    • 局部静态变量只在其定义的函数内部可见。
    • 局部静态变量常用于需要在函数调用之间保持状态的场景,例如计数器或状态标志。
  2. 全局静态变量

    • 在函数外部定义的静态变量(即全局静态变量)具有文件作用域(file scope),而不是全局作用域(global scope)。这意味着,这个变量只在定义它的源文件内部可见,对其他源文件是不可见的。
    • 全局静态变量的存储期是整个程序的执行期间。
    • 全局静态变量常用于需要在多个函数之间共享数据,但又不想在其他源文件中暴露这个变量的场景。
  3. 静态函数

    • 当一个函数被声明为static时,它的可见性仅限于定义它的源文件。即使这个函数在头文件中有声明,其他源文件也不能链接到这个函数。
    • 静态函数通常用于只在特定源文件中使用的辅助函数,或者用于避免命名冲突(例如,当多个源文件都包含具有相同名称的函数时)。
  4. 静态局部变量在循环中的用途

    • 虽然不常见,但在某些情况下,可以使用静态局部变量在循环中保存状态。例如,你可以使用静态局部变量来跟踪循环的迭代次数,或者保存上一次迭代中的某些信息。
  5. 防止重复初始化

    • 当一个静态变量在函数内部被初始化时,这个初始化只会在程序开始时发生一次。后续的函数调用不会重新初始化这个变量。
  6. 内存管理

    • 由于静态变量的存储期是整个程序的执行期间,它们不会被频繁地创建和销毁,这有助于减少内存分配和释放的开销。
  7. 线程安全

    • 在多线程环境中,每个线程都有自己的静态局部变量副本,因此它们是线程安全的。但是,请注意,这并不意味着静态变量本身总是线程安全的;如果多个线程访问和修改同一个全局静态变量,则可能会出现问题。
  8. 代码优化

    • 由于静态变量的存储期长且可见性有限,编译器可能能够对其进行更优化的处理,例如将其存储在寄存器中或进行内联优化。但是,这种优化通常是自动的,并且可能因编译器和平台而异。

在C语言中,你可以在函数内部声明一个局部静态变量,通过在变量声明前加上static关键字来实现。局部静态变量在函数第一次被调用时初始化,并且其值在函数调用之间保持不变。即使函数返回,局部静态变量的值也不会丢失,下次函数调用时它仍然保持上次的值。

下面是一个简单的示例,展示了如何在C语言中声明局部静态变量:

#include <stdio.h>  void count_calls() {  static int call_count = 0; // 声明一个局部静态变量  call_count++;  printf("This function has been called %d times.\n", call_count);  
}  int main() {  count_calls(); // 输出:This function has been called 1 times.  count_calls(); // 输出:This function has been called 2 times.  return 0;  
}

在这个例子中,count_calls函数有一个局部静态变量call_count,它在函数第一次被调用时初始化为0。每次调用count_calls函数时,call_count的值都会递增,并输出到目前为止函数被调用的次数。由于call_count是静态的,它在函数调用之间保持了其值。

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

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

相关文章

2024-05-24 思考-关于软件架构设计

摘要: 2024-05-24 思考-关于软件架构设计 软件架构设计: 虽然在商业的战略中&#xff0c;软件代码只是起到最后的一个环节&#xff0c;但是对于业务本身来说&#xff0c;还是应该站在商业的视角上&#xff0c;去看待技术的实现此前读过的比较有价值的关于软件架构设计的书&…

【全开源】简单商城系统(PC/UniAPP)

轻松构建您的在线商店 在当今数字化时代&#xff0c;拥有一个在线商店对于许多商家来说已成为必不可少的营销手段。为了满足这一需求&#xff0c;我们推出了“简单商城系统源码”&#xff0c;让您轻松构建并管理您的在线商店。 一、简单易用&#xff0c;快速上手 “简单商城…

C++第三方库【JSON】— jsoncpp

目录 认识JSON jsoncpp库 安装&使用 认识jsoncpp Json::Value jsoncpp序列化 jsoncpp反序列化 认识JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;常用于在客户端和服…

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述 源码放在文章末尾 该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果&#xff0c;项目demo演示如下所示&#xff1a; 项目解析&#xff1a; new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象&#xff0c;第一个参数传…

用python做的一个井子棋游戏——浔川python社

简介&#xff1a; 在井子棋的基础上&#xff0c;我们改进了登录界面。允许大量玩家注册! # -*- coding: utf-8 -*- import tkinter as tk import tkinter.messagebox import pickle import random# 窗口 window tk.Tk() window.title(欢迎进入python) window.geometry(450x2…

《Python编程从入门到实践》day37

# 昨日知识点回顾 制定规范、创建虚拟环境并激活&#xff0c;正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…

TypeScript中的类型推断(Type Inference):自动化的类型安全

TypeScript中的类型推断&#xff08;Type Inference&#xff09;&#xff1a;自动化的类型安全 引言 类型推断是TypeScript的一个关键特性&#xff0c;它允许编译器根据值的初始化或上下文自动推导出变量的类型。这减少了需要显式指定的类型注解&#xff0c;同时保持了代码的…

springboot中不同请求方式的注解有哪些,有什么含义

在Spring Boot中&#xff0c;处理Web请求通常使用Spring MVC框架&#xff0c;它提供了一系列的注解来支持不同的HTTP请求方式。以下是一些常用的注解及其含义&#xff1a; RequestMapping: 这是一个通用的映射注解&#xff0c;可以用于映射类或方法到HTTP请求。它支持多种请求方…

Python进阶之深入类和对象

鸭子类型 鸭子类型实际上类似于多态的概念。指的是我们在使用一个父类的时候&#xff0c;不关心子类具体是什么&#xff0c;只要之类实现了父类必须要要实现的方法&#xff0c;我们就把它当成父类使用。 在下面的案例中&#xff0c;鸭子&#xff0c;猫&#xff0c;狗都是动物…

webgl three 几何体

辅助几何体 // AxesHelper&#xff1a;辅助观察的坐标系const axesHelper new THREE.AxesHelper(400);scene.add(axesHelper);//辅助观察网格const gridHelper new THREE.GridHelper(300, 25, 0x004444, 0x004444);scene.add(gridHelper); 基础几何体 //长方体const geomet…

时光初创知识付费模板 3.6.4 安装包 附教程

源码地址&#xff1a; https://wwv.lanzouh.com/b080wj8eh

码蹄集部分题目(2024OJ赛15期;前缀和+栈+堆+队列)

1&#x1f40b;&#x1f40b;&#x1f40b;门票&#xff08;钻石&#xff1b;前缀和&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;输入输出格式 &#x1f41f;样例 &#x1f41a;样例 &#x1f41a;备注 &#x1f4…

西北农林科技大学2024学年C++面向对象程序设计OJ——T15 英文文本单词统计(STL)

一.题目描述 Description 读入一篇英文文章&#xff0c;基于STL中的容器和算法&#xff08;建议包含<map>、<algorithm>、<string>和<sstream>&#xff09;&#xff0c;删除所有标点符号&#xff0c;主要包括英文逗号“,”、句号“.”、分号“;”、感…

docker和containerd的区别

docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时&#xff08;Container Runtime&#xff09;是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一&#xff0c;用于在容器内部运行应用程序&#xff0c;并提供隔离…

Linux 三十六章

​​​​​​​ &#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要…

ORACLE 资源管理参数与等待事件resmgr:cpu quantum

RESOURCE_MANAGER_PLAN 先来看下参数的含义 官网链接&#xff1a;RESOURCE_MANAGER_PLAN (oracle.com) 意思翻译过来这个参数用于资源计划。后边的看完也不是很明白具体的作用 于是参考了以下文章 Oracle 参数 RESOURCE_MANAGER_PLAN 官方解释&#xff0c;作用&#xff0c;…

人从胚胎开始就要交税,直到死亡,是这样吗?

文章目录 梗概税收的基本概念从胚胎到死亡的税收分析胚胎到出生出生到成年成年到死亡 总结 梗概 人从胚胎阶段开始交税直到死亡&#xff0c;这个观点听起来有些戏剧化&#xff0c;但如果我们广义地理解“交税”这个概念&#xff0c;可以从不同的角度进行探讨。实际上&#xff…

ts中的class类

class Animal {constructor(public name: string) {}move(distance: number) {console.log(${this.name} moved ${distance} meters.);} } //这个输出如何输出 这段代码定义了一个名为 Animal 的类&#xff0c;它具有一个构造函数和一个 move 方法。构造函数使用 TypeScript 中…

Steam致富:玩免费游戏Banana获得可交易道具

最近&#xff0c;Steam平台上一款普普通通的免费游戏《Banana》引起了轰动&#xff0c;接近2万人同时在线&#xff0c;好评率高达94&#xff05;&#xff0c;究竟是什么让这款游戏如此受欢迎呢&#xff1f;原来&#xff0c;玩家们都在争相获取稀有的香蕉。 《Banana》属于点击放…

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题

vector&#xff08;上&#xff09;&#xff1a;C初阶学习第八弹——探索STL奥秘&#xff08;三&#xff09;——深入刨析vector的使用-CSDN博客 vector&#xff08;中&#xff09;&#xff1a;C初阶学习第九弹——探索STL奥秘&#xff08;四&#xff09;——vector的深层挖掘和…