4、变量与静态变量

2024-09-07 09:04
文章标签 变量 静态

本文主要是介绍4、变量与静态变量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

变量与静态变量

  • 1、多个文件共享——全局变量+extern
  • 2、单个文件中的函数共享——static修饰的静态全局变量
  • 3、函数私有——局部变量和static静态局部变量
    • (1)局部变量
    • (2)static静态局部变量
  • 4、存储分布与存储期限

关键字作用
extern不改变作用域和生存期,只是用于声明该变量在其它文件中定义,使其在当前文件中可见,只能修饰全局的变量
static不改变作用域,修饰全局变量时,使其对其他文件不可见,作用域限制在本文件;修饰局部变量时,生存期从程序开始到程序结束,即使函数或代码块退出,静态局部变量也不会被销毁,而是保留其值
const不改变作用域和生存期,用于声明全局或局部常量,表明该值不可修改

1、多个文件共享——全局变量+extern

// add.cpp
#include "add.h"
int NUM1 = 5; // 对其他文件可见的全局变量,可以通过在其他文件中extern声明使用它
int NUM2 = 3;
int add() { return NUM1 + NUM2; }// main.cpp
#include <iostream>
#include "add.h"
using namespace std;
extern int NUM1;// 加extern,使用全局变量
extern int NUM2;
int main() {cout << NUM1 << " + " << NUM2 << " = " << add() << endl;return 0;
}

在这里插入图片描述

2、单个文件中的函数共享——static修饰的静态全局变量

// add.cpp对应部分修改为
static int NUM1 = 5; // 对其他文件不可见的static全局变量,只允许本文件使用,不可通过extern在其他文件中使用
static int NUM2 = 3;

static全局变量只允许本文件使用,对其他文件不可见,所以使用extern声明,仍然会出现未定义错误。在这里插入图片描述

3、函数私有——局部变量和static静态局部变量

(1)局部变量

#include <iostream>
using namespace std;
void foo() {int count = 0;  // 局部变量,离开作用域销毁count++;cout << count << endl;
}
int main() {foo();  // 输出:1foo();  // 输出:1foo();  // 输出:1return 0;
}

在这里插入图片描述

(2)static静态局部变量

#include <iostream>
using namespace std;
void foo() {static int count = 0;  // 静态局部变量,离开作用域仍然保存值,静态局部变量在程序第一次执行到该变量定义处时进行初始化,以后每次调用该函数时不会重新初始化。count++;cout << count << endl;
}
int main() {foo();  // 输出:1foo();  // 输出:2foo();  // 输出:3// cout << count << endl; // 错误,静态局部变量count作用域仍是foo函数,不过生存期为整个程序运行期间return 0;
}

在这里插入图片描述

4、存储分布与存储期限

  • 自动存储期限:存放在栈区的数据具有自动存储期限,生命周期随栈帧入栈开始,出栈结束。
  • 静态存储期限:数据拥有永久的存储单元,在程序整个执行期间都存在
  • 程序员管理:存放在上的数据,存储期限由程序员指定,看程序员合适释放。
#include <iostream>
using namespace std;
int a = 0;
static int b = 0;
const int c = 0;
static const int d = 0;
void foo() {static int e = 0;static const int f = 0;int g = 0;const int h = 0;cout << "静态局部变量e: " << hex << &e << endl;cout << "静态局部常量f: " << hex << &f << endl;cout << "局部变量    g: " << hex << &g << endl;cout << "局部常量    h: " << hex << &h << endl;
}
int main() {cout << "全局变量    a: " << hex << &a << endl;cout << "静态全局变量b: " << hex << &b << endl;cout << "全局常量    c: " << hex << &c << endl;cout << "静态全局常量d: " << hex << &d << endl;foo();return 0;
}

在这里插入图片描述

我们可以看到全局变量和静态变量在内存上很接近,这说明它们同属一片内存区域,具有静态存储期限。局部变量位于另一区域,具有自动存储期限。所以在局部变量前加static关键字,它的存储周期变为静态存储期限,在程序整个执行期间都存在。

在这里插入图片描述

这篇关于4、变量与静态变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144642

相关文章

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的