C/C++ 变量详解

news/2024/12/2 19:38:22/

文章目录

  • 前言
  • 一、静态变量与动态变量
    • 1. 概念
    • 2. 区别
    • 3. 使用方法和注意事项
      • 3.1 静态变量
      • 3.2 动态变量
    • 4. 结论
  • 二、全局变量与局部变量
    • 1. 区别
    • 2. 全局变量的使用方法和注意事项
    • 3. 局部变量的使用方法和注意事项
    • 4. 总结


前言

对C++学习感兴趣的可以看看这篇文章哦:C/C++教程

一、静态变量与动态变量

1. 概念


在程序设计中,变量是程序中最基本的元素之一。变量可以用于存储不同类型的数据,包括数字、字符串、布尔值等。静态变量和动态变量是两种不同类型的变量,它们在程序中的使用方式和作用有所不同。

静态变量是指在程序运行时分配内存空间,并且在整个程序的运行过程中保持不变的变量。在C++中,静态变量可以在函数内部或者全局变量中声明。例如:

void test(){static int count = 0;count++;std::cout << "count: " << count << std::endl;
}int main(){for(int i=0; i<5; i++){test();}return 0;
}

在上面的代码中,变量count是一个静态变量,它在函数test()内部被声明,并且被赋初值为0。每当test()函数被调用时,count的值会被增加1,并且在整个程序运行过程中保持不变。在程序运行过程中,会输出5个值,分别为1、2、3、4、5。

动态变量是指在程序运行时动态分配内存空间的变量。在C++中,可以使用关键字new来动态分配内存。例如:

int main(){int *ptr = new int;*ptr = 10;std::cout << "ptr: " << *ptr << std::endl;delete ptr;return 0;
}

在上面的代码中,变量ptr是一个动态变量,它使用关键字new来动态分配内存,并且赋初值为10。在程序运行过程中,会输出ptr的值为10。在变量ptr不再被使用时,需要使用delete关键字释放内存空间。

2. 区别


静态变量和动态变量之间有几个显著的区别:

  • 内存分配方式:静态变量在程序运行时分配内存空间,而动态变量是在程序运行时动态分配内存空间。
  • 生命周期:静态变量在整个程序运行过程中保持不变,而动态变量的生命周期取决于程序运行时的内存管理。
  • 可见性:静态变量的作用域可以是全局的或者函数内部的,而动态变量通常是局部变量。
  • 变量类型:静态变量可以是常量或非常量,而动态变量只能是非常量。

3. 使用方法和注意事项

在使用静态变量和动态变量时,需要注意以下几点:

3.1 静态变量

  • 静态变量可以在函数内部或者全局变量中声明。在函数内部声明的静态变量只能在该函数内部访问,而全局静态变量可以在整个程序中访问。
  • 静态变量的初始值只会被赋值一次,在程序运行过程中保持不变。在函数内部声明的静态变量只会在第一次调用该函数时被初始化,在后续调用中保持不变。
  • 静态变量的作用域可以是全局的或者函数内部的,全局静态变量只能在该文件中访问。在不同的文件中定义相同名称的静态变量是不会冲突的。

3.2 动态变量

  • 动态变量需要使用new关键字来动态分配内存空间,并且需要使用delete关键字来释放内存空间。如果没有释放内存空间,就会导致内存泄漏。
  • 动态变量的生命周期取决于程序运行时的内存管理。在程序运行过程中,需要确保释放不再使用的动态变量的内存空间。
  • 动态变量通常是局部变量,只能在函数内部访问。如果需要在函数外部访问动态变量,可以使用返回指针的方式。

4. 结论


静态变量和动态变量是程序设计中常用的两种变量类型,它们在内存分配方式、生命周期、可见性和变量类型等方面存在明显的区别。在使用静态变量和动态变量时,需要根据实际情况选择合适的变量类型,并且遵循使用方法和注意事项,以确保程序的正确性和稳定性。

二、全局变量与局部变量

1. 区别

全局变量和局部变量是C++中两种不同类型的变量,它们之间的主要区别如下:

  1. 作用域不同:全局变量的作用域是整个程序,而局部变量的作用域只在定义它的函数或代码块内。

  2. 生命周期不同:全局变量的生命周期是整个程序运行期间,而局部变量的生命周期只在它所在的函数或代码块执行期间。

  3. 内存位置不同:全局变量存储在静态存储区,局部变量存储在栈上。

2. 全局变量的使用方法和注意事项


全局变量可以在程序中的任何地方使用,但在使用前需要注意以下几点:

  1. 声明和定义:需要在文件的顶部声明全局变量,并在函数外部定义它们。
// 声明全局变量
extern int global_variable;// 定义全局变量
int global_variable = 0;
  1. 命名冲突:全局变量可能会和其他文件或库中的变量发生命名冲突,需要避免重复命名。

  2. 可见性:全局变量的作用域是整个程序,因此可能会被程序中的任何部分访问或修改,需要注意变量的可见性和安全性。

  3. 初始化:全局变量默认情况下会被初始化为0或空指针,也可以在定义时进行初始化。

// 定义并初始化全局变量
int global_variable = 10;

3. 局部变量的使用方法和注意事项


局部变量只在定义它的函数或代码块内可见,使用时需要注意以下几点:

  1. 声明和定义:局部变量需要在函数或代码块内部声明和定义。
void some_function() {// 声明和定义局部变量int local_variable = 0;
}
  1. 生命周期:局部变量的生命周期仅限于定义它的函数或代码块的执行期间,执行结束后会被自动销毁。

  2. 内存位置:局部变量存储在栈上,因此在定义时需要注意变量的大小和栈的大小。

void some_function() {// 定义一个较大的局部变量char buffer[1024];// ...
}
  1. 初始化:局部变量可以在定义时进行初始化,也可以在后续的代码中进行初始化。
void some_function() {// 定义并初始化局部变量int local_variable = 10;// ...// 后续代码中进行初始化local_variable = 20;
}

4. 总结


全局变量和局部变量在C++中有着不同的作用和使用方式,需要注意它们的区别和注意事项,避免出现不必要的错误。全局变量适用于需要在程序中的多个位置使用的变量,而局部变量适用于只在函数或代码块内部使用的变量。在使用变量时,需要注意变量的作用域、生命周期、内存位置、命名冲突和初始化等问题,以确保程序的正确性和稳定性。


http://www.ppmy.cn/news/38901.html

相关文章

【从零开始学习 UVM】9.3、UVM Config DB —— uvm_config_db 示例【文章最后的表格对于理解路径索引很重要】

文章目录 Methods规则如何调试 uvm_config_db?示例1. Test and EnvCase #1Case #22. Test, Env, and two Agents推荐实战方式set 与 get 结果由类uvm_config_db访问的UVM配置数据库是在多个TestBench组件之间传递不同对象的好方法。 Methods 有两个主要的函数用于将数据放入…

数据库中,索引详解

数据库索引是一种数据结构&#xff0c;可以提高数据库查询操作的效率。它通过在表中的某一列或多列上创建索引&#xff0c;使得数据库能够更快速地定位到需要查询的数据&#xff0c;从而减少查询的时间和资源消耗。 举一个例子&#xff0c;假设有一个学生信息表&#xff0c;其…

九.microchip MCU D51(QFN 64PIN) 与LAN9252的PIN配置

七.microchip MCU D51(QFN 64PIN) 与LAN9252的PIN配置 7.0 参考工程 D:\HarmonyProjects\ethercat\apps\ethercat_counter_foe_app\firmware\sam_d51_lan9252_evb.X 7.1.MCU D51(QFN 64PIN) QSPI相关硬件PIN PIN17 PA08–QSPI_DATA0&#xff08;MOSI&#xff09; PIN18 PA09…

chatGPT对话R语言

文章目录R语言介绍R语言基本语法R语言常用函数有哪些R语言数据结构向量矩阵数组和列表数组列表数据框因子R如何导入数据如何在R语言中导出数据&#xff1f;R语言图形绘制描述性统计描述统计也可以这样来计算统计推断配对设计t检验样本均数和总体均数t检验两&#xff08;独立&am…

读书笔记-纳瓦尔宝典-2023.04.01

重点 财富 如何构造高价值信息 判断力 何为幸福 启发 最近看了这本书的大部分内容&#xff0c;感悟颇多&#xff0c;及时记录下来。 因为是快速阅读&#xff0c;还未做深入思考和实践&#xff0c;但对总体的内容有一个大致把握&#xff0c;未来会结合行动反复阅读和思考&…

【蓝桥杯】【嵌入式组别】第四节:Systick系统滴答定时器

Systick编程Systick简介Systick程序设计Systick简介 Systick是CM4内核的系统定时器&#xff0c;是一个24位的向下递减计数器&#xff0c;理论上可以计数2242^{24}224个值&#xff0c;当重装载寄存器的值减为0时就产生一次中断。STM32CUBEMX生成的工程&#xff0c;会自动把Syst…

【JavaWeb】8—过滤器

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

ChatGPT 的平替 Claude 使用指南

Claude的独立体验版本姗姗来迟&#xff0c;经过近半个月的等待后&#xff0c;收到了体验邮件&#xff0c;不过之前早已体验过poe和slack的集成版&#xff0c;响应速度上要比ChatGPT快很多。目前提供的Model有&#xff1a;"claude-v1"&#xff1a;我们最大的型号&…