C/C++基础知识点

随着工作中琐事越来越多,静下来好好敲代码的时间越来越少,基础知识虽然简单,但常看常新,并记录下来共勉。

一、基础知识点

1. 内存区域中数据管理

在C和C++中,内存分为多个区域,每个区域负责存储不同类型的数据。以下是对不同存储区域的简要说明:

(1)静态区域(Static Memory)

  • 存储内容:静态区域用于存储程序的全局变量、静态变量和常量(const修饰的变量)。这些变量的生命周期从程序开始到程序结束。
  • 存储位置:静态变量和常量存储在静态数据区,通常包括:
    • 全局变量:存储在静态数据区中,程序运行时一直存在。
    • 静态局部变量:通过static关键字声明的局部变量,存储在静态数据区,不会在函数调用结束时销毁。
    • 常量:如果常量是全局常量或者在程序中明确作为常量定义,它通常也存储在静态数据区。

(2) 堆(Heap)

  • 存储内容:堆是程序运行时动态分配内存的区域。它主要用于存储通过mallocnew等动态内存分配函数分配的内存。堆中的内存需要手动释放(如通过freedelete)。
  • 存储位置:堆中的内存位置是动态的,且程序可以在运行时随时进行分配和释放。因此,它适合存储大小不固定或者需要在运行时决定存储空间的数据结构(如链表、树等)。

(3) 栈(Stack)

  • 存储内容:栈主要用于存储函数的局部变量、函数的返回地址以及函数的调用信息(如函数调用时保存的寄存器等)。当函数被调用时,栈会为该函数分配空间,函数返回时,栈空间会被自动释放。
  • 存储位置:栈上的变量具有“自动存储持续性”,即它们的生命周期仅限于函数的调用周期。栈存储的变量通常是临时的、局部的变量。栈的内存分配和释放由编译器自动管理,不需要手动干预。

总结:

  • 静态区域:全局变量、静态变量、常量。
  • :动态分配的内存(通过mallocnew等)。
  • :函数局部变量、函数调用信息。

每个区域的存储方式和管理方式有所不同,栈和堆是由程序运行时进行管理的,而静态区域则在程序启动时分配并在程序退出时释放。

2. 全局变量、静态变量、常量的区别

在C和C++中,全局变量、静态变量和常量有着不同的特性和用途。以下是它们的主要区别:

(1) 全局变量(Global Variables)

  • 定义:全局变量是在所有函数外部定义的变量,通常定义在源文件的最外层。
  • 生命周期:全局变量的生命周期从程序开始执行到程序结束。
  • 作用域:全局变量的作用域是整个程序,任何函数都可以访问和修改全局变量。
  • 存储位置:全局变量通常存储在静态数据区(BSS段或数据段),并且在程序开始时被初始化。
  • 初始化:如果没有显式初始化,全局变量会被自动初始化为零(对于基本数据类型)。

示例

int globalVar = 10;  // 全局变量void foo() {globalVar = 20;  // 可以在函数中访问和修改全局变量
}

(2) 静态变量(Static Variables)

  • 定义:静态变量是在函数内部或外部使用static关键字声明的变量。对于函数内部的静态变量,它的生命周期与程序的生命周期相同,但它的作用域仅限于函数内部。
  • 生命周期:静态变量的生命周期从程序开始执行到程序结束,即使是局部静态变量,它也不会在函数调用结束时销毁。
  • 作用域
    • 局部静态变量:仅限于声明它的函数内部,其他函数无法访问。
    • 全局静态变量:作用域仅限于声明它的源文件,其他源文件无法访问(这时它是一个文件内部的全局变量,具有“内联”特性)。
  • 存储位置:静态变量存储在静态数据区(BSS段或数据段)。
  • 初始化:静态变量在程序启动时自动初始化为零,如果显式初始化则使用指定的值。

示例

void foo() {static int counter = 0;  // 静态局部变量counter++;printf("Counter: %d\n", counter);
}

每次调用foo()时,counter会保留其上次的值,而不像普通局部变量那样每次进入函数时都会被重新初始化。

(3) 常量(Constants)

  • 定义:常量是指值在程序运行时不能修改的变量。常量可以使用const关键字来声明,或者使用#define宏定义。
  • 生命周期:常量的生命周期通常与它所在的程序区域相同,通常存储在只读数据区静态数据区中。
  • 作用域:常量的作用域与其声明的位置相关。局部常量仅限于其声明的作用域,而全局常量可以在整个程序中访问。
  • 存储位置:常量通常存储在程序的只读数据区。
  • 初始化:常量在声明时必须进行初始化,并且值在程序运行过程中不可修改。

示例

const int MAX_VALUE = 100;  // 常量,初始化后不能修改void foo() {// MAX_VALUE = 200;  // 错误,常量不能修改
}

区别总结:

特性全局变量静态变量常量
定义位置函数外部定义函数内部或外部使用static关键字声明使用const关键字或#define定义
生命周期程序从开始到结束程序从开始到结束程序从开始到结束
作用域程序中的任何地方都可以访问仅限于函数或源文件仅限于其声明的作用域
初始化如果没有初始化,会被自动初始化为零如果没有显式初始化,会自动初始化为零必须在声明时初始化,并且不可修改
存储位置静态数据区(BSS段或数据段)静态数据区(BSS段或数据段)静态数据区或只读数据区
是否可修改可修改可修改(局部静态变量,除非为常量)不可修改

关键点:

  • 全局变量:程序中的任何地方都可以访问,生命周期贯穿整个程序。
  • 静态变量:生命周期与程序相同,但作用域受限,可以是局部的(函数内部)或全局的(仅在文件内有效)。
  • 常量:值不可修改,初始化后不允许更改。

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

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

相关文章

消息中间件kafka,rabbitMQ

在分布式系统中,消息中间件是实现不同组件之间异步通信的关键技术。Kafka 和 RabbitMQ 是两个非常流行的消息中间件系统,它们各自有着不同的特点和应用场景。下面将分别介绍 Kafka 和 RabbitMQ,并讨论它们在消息队列中的使用。 一、Kafka (Apache Kafka) 主要特点: 高吞吐…

2k1000LA , 调试串口改成通信串口, uart.

客户的问题解决了,但是 调试串口 改成通信串口的问题,并没有解决,我走的其他的路径。 先准备一些资料。 以备以后使用。 网上的资料。 总结: 实际上 有几种思路了。 1 就是更改 设备树的 chosen 节点, 瑞芯微又单独…

springboot集成spring-cloud-context手动刷新并读取更新后的配置文件

背景 springboot单体项目在运行过程需要刷新springboot配置文件值,比如某个接口限流阈值,新增某个账户等场景。分布式设计的可以直接引入一些持久化中间件比如redis等,也可以用相关配置中心中间件如nacos等。处于成本等场景单体项目可以考虑①…

proteus8.17 环境配置

Proteus介绍 Proteus 8.17 是一款功能强大的电子设计自动化(EDA)软件,广泛应用于电子电路设计、仿真和分析。以下是其主要特点和新功能: ### 主要功能 - **电路仿真**:支持数字和模拟电路的仿真,包括静态…

手机端可部署的开源大模型; 通义千问2.5训练和推理需要的内存和外存

手机端可部署的开源大模型 目录 手机端可部署的开源大模型Qwen2.5 0.5B 7b 推理采用手机内存需要多少Qwen2.5 0.5B不同量化精度下的内存需求Qwen2.5 7B不同量化精度下的内存需求通义千问2.5训练和推理需要的内存和外存推理阶段1. Qwen2.5 - 7B2. Qwen2.5 - 14B3. Qwen2.5 - 72B…

【uniapp-兼容性处理】swiper在iOS上偶发出现后几张图片白屏情况

【日期】2025-04-14 【问题】 swiper在iOS上偶发出现后几张图片白屏情况 swiper内部的几个swiper-item垂直排列,各自进行滚动,样式方面兼容性出现问题 【原因】: 原代码:(不应在swiper-item添加style属性&#xf…

SpringBoot连接MQTT客户端

引入依赖 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.2</version> </dependency> 启动类 SpringBootApplication public class AxiosDemoApplic…

HTML:网页的骨架 — 入门详解教程

HTML&#xff1a;网页的骨架 — 入门详解教程 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页的基础语言&#xff0c;负责定义网页的结构和内容。无论是简单的个人博客&#xff0c;还是复杂的企业网站&#xff0c;HTML都是不可或…

212、【图论】字符串接龙(Python)

题目描述 题目链接&#xff1a;110. 字符串接龙 代码实现 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用队列遍历结点 deque.append([beginStr, 1]) # 存储当前字符串和遍…

操作系统导论——第19章 分页:快速地址转换(TLB)

使用分页作为核心机制来实现虚拟内存&#xff0c;可能会带来较高的性能开销。使用分页&#xff0c;就要将内存地址空间切分成大量固定大小的单元&#xff08;页&#xff09;&#xff0c;并且需要记录这些单元的地址映射信息。因为这些映射信息一般存储在物理内存中&#xff0c;…

使用Apache POI(Java)创建docx文档和表格

1、引入poi 依赖组件 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version> </dependency> <dependency><groupId>org.apache.poi</groupId>&…

python cv2 安装

在Python中安装opencv-python&#xff08;即OpenCV库&#xff09;&#xff0c;通常有两种方法&#xff1a;使用pip命令或通过conda&#xff08;如果你使用的是Anaconda或Miniconda&#xff09;。以下是详细的步骤&#xff1a; 方法1&#xff1a;使用pip 打开你的命令行界面&am…

读者、写者问题优化

#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define NUM_READERS 5 #define NUM_WRITERS 5 // 定义信号量和全局变量 sem_t sdata, srcount; int rea…

如何通过前端表格控件实现自动化报表?1

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…

RabbitMQ 优先级队列详解

本文是博主在记录使用 RabbitMQ 在执行业务时遇到的问题和解决办法&#xff0c;因此查阅了相关资料并做了以下记载&#xff0c;记录了优先级队列的机制和使用要点。 本文为长文&#xff0c;详细介绍了相关的知识&#xff0c;可作为学习资料看。 文章目录 一、优先级队列介绍1、…

代理模式简述

目录 一、主要角色 二、类型划分 三、静态代理 示例 缺点 四、动态代理 JDK动态代理 示例 缺点 CGLib动态代理 导入依赖 示例 五、Spring AOP 代理模式是一种结构型设计模式&#xff0c;通过代理对象控制对目标对象的访问&#xff0c;可在不改变目标对象情况下增强…

每日一题——云服务计费问题

云服务计费问题&#xff08;哈希表 排序&#xff09;| 附详细 C源码解析 一、题目描述二、输入描述三、输出描述四、样例输入输出输入示例&#xff1a;输出示例&#xff1a;说明&#xff1a; 五、解题思路分析六、C实现源码详解&#xff08;完整&#xff09;七、复杂度分析 一…

【JVM】运行时数据区域

文章目录 1. 程序计数器补充 2. 虚拟机栈2.1 栈帧1. 局部变量表2. 操作数栈3. 动态链接4. 方法返回地址补充 3. 本地方法栈4. 堆5. 方法区静态常量池&#xff08;Class常量池&#xff09;运行时常量池字符串常量池&#xff08;1&#xff09;位置变化&#xff08;2&#xff09;放…

day28图像处理OpenCV

文章目录 一、图像预处理4 边缘填充4.1 边界复制&#xff08;BORDER_REPLICATE&#xff09;4.2 边界反射&#xff08;BORDER_REFLECT&#xff09;4.3 边界反射101&#xff08;BORDER_REFLECT_101&#xff09;4.4 边界常数&#xff08;BORDER_CONSTANT&#xff09;4.5 边界包裹&…

C++ Json-Rpc框架-3项目实现(2)

一.消息分发Dispatcher实现 Dispatcher 就是“消息分发中枢”&#xff1a;根据消息类型 MType&#xff0c;把消息派发给对应的处理函数&#xff08;Handler&#xff09;执行。 初版&#xff1a; #pragma once #include "net.hpp" #include "message.hpp"n…