卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与语法

    • 介绍c++一下三大特性
    • 指针和引用的区别
    • 结构体和类的区别
    • 结构体与联合体的区别
    • static关键字和const关键字的作用
    • extern C的作用
    • volatile关键字的作用
    • inline函数与宏的区别与优劣
    • auto和decltype的区别
    • sizeof和strlen的区别
    • 浮点数比较方法
    • 静态局部变量,全局变量,局部变量的特点,以及使用场景
      • 简要回答
      • 详细回答
      • 怎么用
      • 知识拓展
    • C++中四种类型转换
  • 面向对象

  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

  • 智能指针

  • 并发与 I/O

# 静态局部变量,全局变量,局部变量的特点,以及使用场景

(下文知识拓展部分提供了演示图例)

# 简要回答

# 静态局部变量,全局变量,局部变量的使用场景

  • 静态局部变量:函数内定义,用static修饰,生命周期为整个程序,该变量无法在作用域外修改,只能被初始化一次,之后每次调用都保持上以上调用结束时的值,存储在数据段。
  • 全局变量:函数外定义,生命周期是整个程序运行区间,程序中可以在任何地方访问,创建在堆上。
  • 局部变量:函数内定义,作用域和生命周期只能在声明该变量的函数体内或者类内访问,每次调用重新创建,生命周期随着函数的返回而结束,创建在栈上。

# 静态局部变量,全局变量,局部变量的使用场景如下表所示

分类 局部变量 静态局部变量 全局变量
作用域 当前函数或者代码块内 当前函数内部(外部不能访问) 整个程序内
生命周期 每次进入函数创建,用完就没 程序一运行就存在,一直到程序结束 程序启动时创建,程序结束才销毁
初始化行为 不赋值的话值不确定(是随机的) 初始化一次(默认0),之后值会保留 默认初始化为0
存储位置 栈区(stack),速度快但不持久 数据段或 BSS 段(非栈),可长期保存 数据段或 BSS 段,生命周期长
适合场景 做临时运算,比如循环里的变量、临时数组等 想在函数里“记住之前的值”,如统计次数、递归深度控制等 整个程序都需要共享的变量,比如配置信息、缓冲区等

# 详细回答

# 全局变量

全局变量定义在所有函数外面,整个程序都能访问,它从程序启动时就存在。

若在其他文件中使用,需要用extern关键字声明,默认也会被初始化为0,和静态局部变量一样存储在静态存储区。

若用"static"修饰的全局变量,仅限当前文件使用,避免与其他文件同名变量冲突。

# 静态局部变量

在函数内部定义,使用static关键字声明,比如"static int count",其生命周期不随函数调用结束而销毁,可保留上次的值。

第一次调用函数时初始化后,之后每次调用都不会重新初始化,而是保持上次的值,这种变量被放在一个特殊的内存区域(静态存储区),所以函数执行完也不会被销毁。

它默认会被自动初始化为0,适合用来做计数器或者缓存一些需要在多次函数调用之间保持的数据。

# 局部变量

在函数或代码块内部定义。这种变量的特点是“随用随弃”,随函数调用创建、执行结束后销毁,存储在栈内存中,存取速度很快,如果不初始化,它的值会是随机的(这点和全局变量、静态变量不同)。

需要注意的是,如果局部变量和全局变量同名,在函数内部会优先使用局部变量,相当于暂时"屏蔽"了同名的全局变量。

局部变量最适合存放一些临时数据,比如循环计数器、函数内部的中间计算结果等,用完就自动释放,不会占用额外内存。

# 怎么用

全局变量是那种“很多地方都要用”的数据,比如配置参数、程序状态什么的,放在最外面,全局共享。但不建议乱用,容易让程序变得混乱、难维护,非必要别用它,用的话要写清楚、注释好。

静态局部变量适合在一个函数里需要“记住上一次的值”的情况,比如要在函数里做一个计数器、记录某个初始化状态,只想执行一次,就加个 static,函数每次运行,它都能记得上一次的结果。

局部变量最常用,能用就用它,它只在当前函数里生效,用完就销毁,最干净、安全、不容易出错,处理临时数据、普通运算,直接写局部变量就够了。

# 静态局部变量,全局变量,局部变量的代码演示

  • 静态局部变量示例
  #include <iostream>
  using namespace std;
  void counter() {
      static int count = 0;  // 静态局部变量
      count++;
      cout << "Static local count: " << count << endl;
  }
  int main() {
      counter();  // 输出: Static local count: 1
     counter();  // 输出: Static local count: 2
     return 0;
 }
1
2
3
4
5
6
7
8
9
10
11
12
  • 全局变量示例
  #include <iostream>
  using namespace std;
  int globalVar = 100;  // 全局变量
  void modifyGlobal() {
      globalVar += 50;
      cout << "Modified global: " << globalVar << endl;
  }
  int main() {
      cout << "Initial global: " << globalVar << endl;  // 输出: Initial global: 100
     modifyGlobal();  // 输出: Modified global: 150
     return 0;
 }
1
2
3
4
5
6
7
8
9
10
11
12
  • 局部变量示例
  void calculate() {
      int localVar = 5;  // 局部变量
      localVar *= 2;
      cout << "Local variable: " << localVar << endl;  // 输出: Local variable: 10
      // localVar 在此处销毁
  }
  int main() {
      calculate();
      // cout << localVar;  // 错误:局部变量不可见
     return 0;
 }
1
2
3
4
5
6
7
8
9
10
11

# 知识拓展

  • 静态局部变量,全局变量,局部变量特点的示意图:

image

  • 内存四区的示意图

    image

Last Updated: 3/10/2026, 6:08:48 PM

← 浮点数比较方法 C++中四种类型转换 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪