day13|C++重难点之 静态变量、全局变量、局部变量的区别,在内存上是怎么分布的、指针和引用的区别、C++内存分区

day13|C++重难点之 静态变量、全局变量、局部变量的区别,在内存上是怎么分布的、指针和引用的区别、C++内存分区

34.静态变量、全局变量、局部变量的区别,在内存上是怎么分布的

三者的特点、使用场景、内存分布都不相同

1.静态局部变量

  • 它的特点 :
    • 第一个是 作用域:仅仅局限于 声名它们的函数或代码块内部
    • 第二个是 生命周期:却是在程序的整个运行时间内都存在
    • 第三个是 初始化:在第一次使用前初始化,且 只初始化一次,保持值直到程序结束
  • 对于使用场景 :
    • 第一个是 你需要一个变量,它只能在函数內部使用,但是 它的值可以在函数调用之间保持不变,那么就可以用静态局部变量
    • 第二个是 它适用于需要缓存数据来提高性能的情况
  • 对于内存分布 :静态局部变量 存储在 全局或静态存储区

2.局部变量

  • 它的特点 :
    • 作用域 :仅在声明它们的函数或代码块内部
    • 生命周期:局部变量在函数调用时创建,函数调用结束后就销毁了
    • 初始化:局部变量必须在使用前 显式初始化
  • 使用场景
    • 第一个是 当需要临时存储数据,且这些数据只是在当前作用域内使用
    • 第二个是 可以作为 循环计数器 或 中间计算结果
  • 对于内存分布 :局部变量存储在栈上,与它们所在的作用域相关联

3.全局变量

  • 特点 :
    • 作用域:全局变量在整个程序中都是可见的,可以在任何函数或代码块中访问
    • 生命周期:它们在程序的整个运行期间都存在
    • 初始化:通常在 程序启动时初始化
  • 使用场景 :
    • 当需要在程序的多个部分 共享一个数据
    • 适用于 存储配置信息 或 程序的状态信息
    • 需要注意 全局变量可能导致代码 难以测试和维护
  • 内存分布 :全局变量也存储在全局或者静态存储区

35.指针和引用的区别

  • 从 概念 上来说:

    • 指针 是存储另一个变量地址的变量,它指向内存中的一个位置
    • 而引用 就是变量的别名
  • 在 初始化 上:

    • 指针可以被初始化为 NULL或nullptr,表示 它步指向任何地址。
    • 而引用 在定义时必须初始化,不能引用NULL或不存在的内存地址
  • 在 可变性 上:

    • 指针 可以改变它的指向,使其指向不同的内存地址
    • 而引用 一旦被初始化,就只能一直引用同一个对象,不能改变绑定
  • 在 操作 上:

    • 指针 可以通过 解引用操作符* 来访问指针指向的变量的值,还可以通过 地址运算符& 获取变量的地址
    • 而引用 不需要使用 解引用操作符,因为引用本身就是 变量的别名
  • 在用途上:

    • 指针 通常用于 动态内存分配、数组操作以及函数参数传递
    • 引用 通常用于 创建别名、函数参数传递以及操作符重载

36.C++内存分区

主要有五个区域:

  • 第一个是 栈:用来存储 局部变量 和 函数调用的上下文。栈的内存分配是 自动的,由编译器管理

  • 第二个是 堆:用于 动态内存分配。可以用 new、malloc等操作符或函数 从堆上 分配内存,并使用delete、free 释放内存

  • 第三个是 全局或静态存储区:用来存储全局变量和静态变量,其中

  • 数据段 用来存储 已初始化的 全局变量和静态变量

  • BSS段 用来存储 未初始化的 全局变量和静态变量

  • 第四个是 常量存储区:用来存储程序中的常量数据,如字符串字面量

  • 第五个是 代码段:用来存储 程序的可执行代码 和 函数的二进制指令

相关推荐
青瓦梦滋6 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
CodeYp201911 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
pipixia2003312 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
牵猫散步的鱼儿14 小时前
C++ 内存分区
c++
choumin15 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
谙弆悕博士15 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
stolentime16 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx16 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官17 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月17 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理