当前位置: 首页 > article >正文

C语言进阶知识:深入探索编程的奥秘

一、指针:C语言的灵魂

指针是C语言中最核心的概念之一,它为程序员提供了对内存的直接操作能力。指针变量存储的是一个地址,通过这个地址可以访问和修改内存中的数据。

(一)指针的基本操作

  1. 指针的声明 指针的声明格式为:类型 *指针变量名;。例如,int *p; 表示声明了一个指向 int 类型的指针变量 p。这里的 * 表示这是一个指针。

  2. 指针的赋值 指针可以通过取地址运算符 & 获得某个变量的地址。例如:

int a = 10;
int *p = &a;
  1. 此时,p 存储了变量 a 的地址。通过指针访问变量的值可以使用解引用运算符 *,如 *p 就表示变量 a 的值。

  2. 指针的运算 指针支持一些特殊的运算,如加法和减法。对于指向数组的指针,p + 1 表示指向数组中下一个元素的地址,p - 1 表示指向数组中上一个元素的地址。这是因为指针加1时,会根据指针所指向的类型的大小进行偏移。

(二)指针的应用

  1. 动态内存分配 指针与动态内存分配密切相关。C语言提供了 malloccallocrealloc 等函数来动态分配内存,这些函数返回的是一个指向分配内存的指针。例如:

int *arr = (int *)malloc(10 * sizeof(int));
  1. 这里分配了一块可以存储10个 int 类型数据的内存,并将这块内存的地址赋值给指针 arr。使用完动态分配的内存后,需要使用 free 函数释放内存,避免内存泄漏。

  2. 函数参数传递 指针常用于函数参数传递,尤其是当需要修改函数外部变量的值时。通过传递变量的地址,函数可以直接操作原始数据。例如:

void increment(int *p) {(*p)++;
}
  1. 调用 increment(&a); 时,函数会直接修改变量 a 的值。

  2. 指针数组与数组指针 指针数组是一个数组,其元素都是指针。例如:

int *ptrArray[10];

这是一个包含10个指针的数组。而数组指针是指向数组的指针,例如: 

int (*arrPtr)[10];
  1. 这是一个指向包含10个整数的数组的指针。

(三)指针的高级应用

  1. 指针链表 指针是实现链表的关键。链表是一种动态数据结构,每个节点包含数据和指向下一个节点的指针。例如:

typedef struct Node {int data;struct Node *next;
} Node;
  1. 通过指针操作,可以方便地插入、删除和遍历链表。

  2. 多级指针 多级指针是指指针的指针。例如,int **p; 表示一个指向指针的指针。多级指针在处理二维数组或动态数组时非常有用。例如,可以使用双指针来动态分配二维数组:

int **arr = (int **)malloc(5 * sizeof(int *));
for (int i = 0; i < 5; i++) {arr[i] = (int *)malloc(10 * sizeof(int));
}

二、内存管理:掌控资源的关键

内存管理是C语言编程中非常重要的一部分。合理地分配和释放内存可以避免内存泄漏和程序崩溃。

(一)栈与堆

  1. 栈内存 栈内存是程序运行时自动分配和释放的内存区域。局部变量和函数调用的上下文信息都存储在栈中。栈内存的特点是分配和释放速度快,但容量有限。

  2. 堆内存 堆内存是通过动态内存分配函数(如 malloccalloc)分配的内存。堆内存的大小通常比栈内存大得多,但分配和释放速度较慢。堆内存需要程序员手动释放,否则会导致内存泄漏。

二、内存管理:掌控资源的关键

内存管理是C语言编程中极为重要且复杂的一部分。它不仅关系到程序的性能,还直接影响程序的稳定性和可靠性。C语言提供了对内存的直接操作能力,但同时也将内存管理的责任交给了程序员。合理地分配和释放内存是避免程序崩溃和资源浪费的关键。

(一)栈与堆

C语言中的内存主要分为栈内存和堆内存,它们在程序运行中扮演着不同的角色。

  1. 栈内存 栈内存是程序运行时自动分配和释放的内存区域,主要用于存储局部变量和函数调用的上下文信息。栈内存的分配和释放非常快,因为它是按照后进先出(LIFO)的原则进行管理的。当函数被调用时,局部变量会被分配到栈上;当函数返回时,这些局部变量占用的内存会自动释放。然而,栈内存的容量相对有限,通常只有几MB,因此不适合存储大量数据。

  2. 堆内存 堆内存是通过动态内存分配函数(如malloccallocrealloc)分配的内存。与栈内存不同,堆内存的大小通常比栈内存大得多,可以存储大量的数据。堆内存的分配和释放需要程序员手动管理。如果程序员忘记释放堆内存,就会导致内存泄漏,程序占用的内存会不断增加,最终可能导致系统崩溃。因此,合理地管理堆内存是C语言程序员必须掌握的技能。

(二)动态内存分配函数

C语言提供了多种动态内存分配函数,用于在堆上分配和释放内存。这些函数的使用需要谨慎,以避免内存泄漏和悬空指针等问题。

  1. malloc malloc函数用于分配一块指定大小的内存,并返回指向这块内存的指针。如果分配失败,malloc会返回NULL。使用malloc时,需要手动指定分配的内存大小,并在使用完毕后调用free函数释放内存。

  2. calloc calloc函数与malloc类似,但它会初始化分配的内存为0。calloc需要指定两个参数:分配的元素数量和每个元素的大小。calloc会自动将分配的内存初始化为0,这在某些情况下比malloc更方便。

  3. realloc realloc函数用于重新分配内存。它可以扩大或缩小已分配的内存块。如果需要扩大内存,realloc会尝试在原内存块后面扩展,如果无法扩展,则会分配一块新的内存,并将原数据复制到新内存中。使用realloc时,需要注意返回值可能是一个新的指针,因此需要更新指针变量。

  4. free free函数用于释放动态分配的内存。释放内存后,指针仍然指向原来的地址,但该地址已经被回收,因此应该将指针设置为NULL,避免悬空指针。

(三)内存泄漏与悬空指针

  1. 内存泄漏 内存泄漏是指动态分配的内存没有被正确释放,导致内存无法被重新使用。内存泄漏会导致程序占用的内存不断增加,最终可能导致系统崩溃。为了避免内存泄漏,需要确保每次调用malloccallocrealloc后,都有对应的free调用。

  2. 悬空指针 悬空指针是指指向已经被释放的内存的指针。使用悬空指针访问内存可能导致不可预测的行为,甚至程序崩溃。为了避免悬空指针,释放内存后应立即将指针设置为NULL

三、结构体与联合体:组织复杂数据

结构体和联合体是C语言中用于组织复杂数据的两种数据类型。它们可以将不同类型的数据组合在一起,方便管理和使用。

(一)结构体

结构体是一种用户定义的数据类型,可以包含多个不同类型的成员。通过结构体,可以将相关的数据组织在一起,形成一个逻辑单元。例如,一个学生的信息可以包括学号、姓名、成绩等,这些信息可以通过一个结构体来表示。结构体的成员可以通过点运算符(.)访问。

结构体还可以嵌套使用,即一个结构体可以包含另一个结构体作为成员。这种嵌套结构可以用来表示更复杂的数据关系。例如,一个Person结构体可以包含一个Address结构体作为成员,从而将人的基本信息和地址信息组织在一起。

结构体的指针可以通过箭头运算符(->)访问成员。结构体指针在处理结构体数组或动态分配的结构体时非常有用。此外,结构体还可以作为函数的参数和返回值,这使得函数可以方便地处理复杂的数据结构。

(二)联合体

联合体是一种特殊的数据类型,它允许多个成员共享同一块内存。联合体的大小等于其最大成员的大小。这意味着联合体的成员可以相互覆盖,同一块内存可以被解释为不同的数据类型。联合体常用于实现内存的高效利用,例如在通信协议中,同一个内存块可以表示不同的数据类型。

联合体的成员可以通过点运算符(.)访问,但由于成员共享内存,访问一个成员可能会覆盖其他成员的值。因此,在使用联合体时需要特别小心,确保不会意外覆盖重要数据。

(三)结构体与联合体的高级应用

  1. 结构体嵌套 结构体嵌套是结构体的一种高级用法,通过嵌套可以构建更复杂的数据结构。例如,一个Person结构体可以包含一个Address结构体作为成员,从而将人的基本信息和地址信息组织在一起。嵌套结构体可以通过多级点运算符访问成员,例如person.addr.city

  2. 位字段 位字段是结构体中的一种特殊成员,它允许程序员指定成员占用的位数。位字段常用于硬件驱动程序开发,可以精确地控制硬件寄存器的位。通过位字段,可以将一个字节划分为多个字段,每个字段占用不同的位数,从而实现高效的内存利用。

四、文件操作:与外部世界的交互

文件操作是C语言中与外部世界交互的重要方式。通过文件操作,可以读取和写入磁盘文件,实现数据的持久化存储。文件操作涉及文件的打开、关闭、读取、写入、定位和随机访问等多个方面。

(一)文件的打开与关闭

  1. fopen fopen函数用于打开一个文件,并返回一个指向FILE类型的指针。fopen需要指定文件名和打开模式(如只读、只写、追加等)。如果文件打开失败,fopen会返回NULL。因此,在使用fopen后需要检查返回值,以确保文件成功打开。

  2. fclose fclose函数用于关闭文件。关闭文件后,文件指针指向的文件将不再可用。在关闭文件之前,需要确保所有数据已经写入文件,并且所有缓冲区已经刷新。关闭文件是防止数据丢失和资源泄漏的重要步骤。

(二)文件读写操作

文件读写操作是文件操作的核心内容。C语言提供了多种函数用于读取和写入文件,包括字符级别的读写(如fgetcfputc)、字符串级别的读写(如fgetsfputs)和二进制数据的读写(如freadfwrite)。

  1. 读取文件

    • 字符级别读取 字符级别的读取函数(如fgetc)每次从文件中读取一个字符,适合逐字符处理文件内容。

    • 字符串级别读取 字符串级别的读取函数(如fgets)每次从文件中读取一行字符串,适合按行处理文件内容。

    • 二进制数据读取 二进制数据的读取函数(如fread)用于读取固定大小的数据块,适合处理二进制文件或结构化数据。

  2. 写入文件

    • 字符级别写入 字符级别的写入函数(如fputc)每次向文件中写入一个字符。

    • 字符串级别写入 字符串级别的写入函数(如fputs)每次向文件中写入一行字符串。

    • 二进制数据写入 二进制数据的写入函数(如fwrite)用于写入固定大小的数据块,适合处理二进制文件或结构化数据。

(三)文件定位与随机访问

文件定位和随机访问是文件操作中的高级功能。通过文件定位函数(如fseekftell),可以移动文件指针的位置,从而实现对文件的随机访问。

  1. fseek fseek函数用于移动文件指针的位置。它需要指定文件指针、偏移量和参考位置(如文件开头、当前位置或文件末尾)。通过fseek,可以方便地在文件中跳转到任意位置。

  2. ftell ftell函数用于获取当前文件指针的位置。它返回文件指针相对于文件开头的偏移量。通过ftell,可以记录文件指针的位置,以便后续操作。

(四)文件的高级操作

  1. 临时文件 临时文件是一种特殊的文件,它在程序运行时创建,程序结束后自动删除。临时文件通常用于存储临时数据,避免占用磁盘空间。C语言提供了tmpfile函数来创建临时文件。

  2. 文件拷贝 文件拷贝是文件操作中的一个常见任务。通过文件读取和写入函数,可以实现文件内容的拷贝。文件拷贝时需要注意文件的打开模式和缓冲区的刷新,以确保数据正确拷贝。

五、位运算:底层编程的利器

位运算是C语言中对二进制位进行操作的一种方式。它在硬件编程、加密算法和数据压缩等领域有广泛应用。位运算操作直接作用于二进制位,因此效率非常高,适合处理底层数据。

(一)位运算符

C语言提供了多种位运算符,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。这些运算符可以直接对二进制位进行操作,实现复杂的逻辑功能。

  1. 按位与(& 按位与运算符用于对两个操作数的每一位进行逻辑与操作。按位与运算常用于清零特定位或检查特定位是否为1。

  2. 按位或(| 按位或运算符用于对两个操作数的每一位进行逻辑或操作。按位或运算常用于设置特定位。

  3. 按位异或(^ 按位异或运算符用于对两个操作数的每一位进行逻辑异或操作。按位异或运算常用于翻转特定位或交换两个变量的值。

  4. 按位取反(~ 按位取反运算符用于对操作数的每一位进行取反操作。按位取反运算常用于生成位掩码。

  5. 左移(<< 左移运算符用于将操作数的二进制位向左移动指定的位数。左移运算可以快速实现乘以2的幂的操作。

  6. 右移(>> 右移运算符用于将操作数的二进制位向右移动指定的位数。右移运算可以快速实现除以2的幂的操作。

(二)位运算的应用

位运算在C语言编程中有着广泛的应用,尤其是在需要高效处理底层数据的场景中。

  1. 位掩码 位掩码是一种常用的位运算技巧,用于设置、清除或检查特定位的值。通过按位与、按位或和按位异或运算,可以方便地操作特定位。

  2. 奇偶校验 奇偶校验是一种简单的错误检测方法,通过按位异或运算可以实现。奇偶校验可以检测数据在传输过程中是否发生了错误。

  3. 快速幂运算 通过位运算可以实现快速幂运算。快速幂运算利用了指数的二进制表示,通过位移和按位与运算,可以快速计算幂的结果。这种方法比传统的循环乘法效率更高,尤其适合处理大指数的幂运算。

  4. 位字段 位字段是结构体中的一种特殊成员,它允许程序员指定成员占用的位数。位字段常用于硬件驱动程序开发,可以精确地控制硬件寄存器的位。通过位字段,可以将一个字节划分为多个字段,每个字段占用不同的位数,从而实现高效的内存利用。

位运算的高效性和灵活性使其成为C语言中处理底层数据的强大工具。掌握位运算不仅可以提升程序的性能,还可以帮助程序员更好地理解计算机的底层工作机制。

相关文章:

C语言进阶知识:深入探索编程的奥秘

一、指针&#xff1a;C语言的灵魂 指针是C语言中最核心的概念之一&#xff0c;它为程序员提供了对内存的直接操作能力。指针变量存储的是一个地址&#xff0c;通过这个地址可以访问和修改内存中的数据。 &#xff08;一&#xff09;指针的基本操作 指针的声明 指针的声明格式…...

机器视觉2D定位引导一般步骤

机器视觉的2D定位引导是工业自动化中的核心应用,主要用于精确确定目标物体的位置(X, Y坐标)和角度(旋转角度θ),并引导机器人或运动机构进行抓取、装配、对位、检测等操作。其一般步骤可概括如下: 一、系统规划与硬件选型 明确需求: 定位精度要求(多少毫米/像素,多少…...

Python-matplotlib中的Pyplot API和面向对象 API

matplotlib中的Pyplot API和面向对象 API Pyplot API&#xff08;状态机模式&#xff09;面向对象 API 详解二者差别核心区别方法命名差异注意事项差别举例 &#x1f345; Pyplot API&#xff08;状态机模式&#xff09;和面向对象 API 是两种不同的编程接口.&#x1f345; 它们…...

FastAPI安全认证:从密码到令牌的魔法之旅

title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdragon excerpt: 在FastAPI中实现OAuth2密码流程的认证机制。通过创建令牌端点,用户可以使用用户名和密码获取JWT访问令牌。代码示例展示了如何使用Cry…...

人工智能时代教师角色的重塑与应对策略研究:从理论到实践的转型

一、引言 1.1 研究背景 近年来&#xff0c;人工智能技术迅猛发展&#xff0c;已经逐渐渗透到社会的各个领域&#xff0c;对人类的生产、生活和学习方式产生了深远影响。作为社会发展的重要组成部分&#xff0c;教育领域也不可避免地受到人工智能的冲击&#xff0c;正经历着前…...

java对接bacnet ip协议(跨网段方式)

1、环境准备 #maven环境<repositories><repository><id>ias-releases</id><url>https://maven.mangoautomation.net/repository/ias-release/</url></repository></repositories><dependencies><dependency><…...

LabVIEW超宽带紧凑场测量系统

采用 LabVIEW 开发超宽带紧凑场测量系统&#xff0c;实现天线方向图、目标雷达散射截面&#xff08;RCS&#xff09;及天线增益的自动化测量。通过品牌硬件设备&#xff0c;优化系统架构&#xff0c;解决传统测量系统在兼容性、数据处理效率及操作便捷性等方面的问题&#xff0…...

编译rustdesk,使用flutter、hwcodec硬件编解码、支持Windows 7系统

目录 安装相应的环境安装visual studio安装vpkg安装rust开发环境安装llvm和clang编译源码下载源码使用Sciter作为UI的(已弃用)使用flutter作为UI的(主流)下载flutter sdk桥接静默安装支持Windows 7系统最近某desk免费的限制越来越多,实在没办法,平时远程控制用的比较多,…...

ROS机器人和NPU的往事和新知-250602

往事&#xff1a; 回顾一篇五年前的博客&#xff1a; ROS2机器人笔记20-12-04_ros2 移植到vxworks-CSDN博客 里面提及专用的机器人处理器&#xff0c;那时候只有那么1-2款专用机器人处理器。 无关&#xff1a; 01&#xff1a; 每代人的智商和注意力差异是如何出现的-250602-…...

【从零开始学习QT】信号和槽

目录 一、信号和槽概述 信号的本质 槽的本质 二、信号和槽的使用 2.1 连接信号和槽 2.2 查看内置信号和槽 2.3 通过 Qt Creator 生成信号槽代码 自定义槽函数 自定义信号 自定义信号和槽 2.4 带参数的信号和槽 三、信号与槽的连接方式 3.1 一对一 &#xff08;1&…...

MCP调研

什么是 MCP MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;&#xff0c;是由 Anthropic 在 2024 年 11 月底推出的开放标准协议&#xff0c;旨在统一大型语言模型&#xff08;LLM&#xff09;与外部数据源、工具的通信方式。MCP 的主要目的在于…...

TDengine 运维——巡检工具(定期检查)

背景 TDengine 在运行一段时间后需要针对运行环境和 TDengine 本身的运行状态进行定期巡检&#xff0c;本文档旨在说明如何使用巡检工具对 TDengine 的运行环境进行自动化检查。 安装工具使用方法 工具支持通过 help 参数查看支持的语法 Usage: taosinspect [OPTIONS]Check…...

8.7 基于EAP-AKA的订阅转移

8.7 基于EAP-AKA的订阅转移 以下场景描述如下情况&#xff1a; • 主ODSA设备应用程序被允许用于该类型主设备&#xff0c;且已获得服务提供商&#xff08;SP&#xff09;授权。 • 终端用户在存有活跃订阅的旧主设备上发起订阅转移请求&#xff0c;且可访问eSIM数据。 • 由于…...

qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力

qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力 完整可运行代码: import torch import torch.nn.functional as F from transformers...

调整数据集的方法

我们对worldquant中的数据&#xff0c; 对数据频率怎么算 在 WorldQuant 平台中&#xff0c;数据更新频率是影响量化策略有效性、回测准确性和实盘交易表现的核心因素之一。它决定了数据的时效性和连续性&#xff0c;直接关系到策略能否捕捉市场动态、应对突发事件或适应不同…...

TCP 四次挥手

引言&#xff1a;优雅的告别 在网络通信中&#xff0c;建立连接需要三次握手&#xff0c;而终止连接则需要四次挥手。这种设计体现了 TCP 协议的可靠性和完整性原则。本文将用通俗易懂的方式&#xff0c;深入解析四次挥手的原理、状态转换和实际应用&#xff0c;帮助您掌握这一…...

MSTNet:用于糖尿病视网膜病变分类的多尺度空间感知 Transformer 与多实例学习方法|文献速递-深度学习医疗AI最新文献

Title 题目 MSTNet: Multi-scale spatial-aware transformer with multi-instance learning for diabetic retinopathy classification MSTNet&#xff1a;用于糖尿病视网膜病变分类的多尺度空间感知 Transformer 与多实例学习方法 01 文献速递介绍 糖尿病视网膜病变&#…...

docker运行程序Killed异常排查

问题描述 我最近开发了一个C 多线程程序&#xff0c;测试没有问题&#xff0c;封装docker测试也没有问题&#xff0c;然后提交给客户了&#xff0c;然后在他那边测试有问题&#xff0c;不定时、不定位置异常中断&#xff0c;以前一直认为只要封装了docker就万事大吉&#xff0…...

【数学 逆序对 构造】P12386 [蓝桥杯 2023 省 Python B] 混乱的数组|普及+

本文涉及知识点 数学 构造 P12386 [蓝桥杯 2023 省 Python B] 混乱的数组 题目描述 给定一个正整数 x x x&#xff0c;请找出一个尽可能短的仅含正整数的数组 A A A 使得 A A A 中恰好有 x x x 对 i , j i, j i,j 满足 i < j i < j i<j 且 A i > A j A_…...

Excel 批量下载PDF、批量下载考勤图片——仙盟创梦IDE

在办公场景中&#xff0c;借助应用软件实现 Excel 批量处理考勤图片、电子文档与 PDF&#xff0c;具有诸多显著优势。 从考勤图片处理来看&#xff0c;通过 Excel 批量操作&#xff0c;能快速提取图片中的考勤信息&#xff0c;如员工打卡时间、面部识别数据等&#xff0c;节省…...

PCIe-Error Detection(一)

下表为PCIe协议中给出的错误&#xff1a; 一、可纠正错误&#xff08;Correctable Errors&#xff0c;8种&#xff09;​​ ​​检错机制​​ ​​错误名称​​​​检测层级​​​​触发条件​​​​Receiver Error​​Physical接收端均衡器&#xff08;EQ&#xff09;监测到…...

向量空间的练习题目

1.考虑 中的向量x1 和x2 求每一向量的长度 令x3x1x2,求x3的长度&#xff0c;它的长度与x1和x2的和有什么关系&#xff1f; 2.重复练习1&#xff0c;取向量 3.令C为复数集合&#xff0c;定义C上的加法为 (abi)(cdi)(ac)(bd)i 并定义标量乘法为对所有实数a (abi) a bi 证明&…...

Leetcode 2123. 使矩阵中的 1 互不相邻的最小操作数

1.题目基本信息 1.1.题目描述 给你一个 下标从 0 开始 的矩阵 grid。每次操作&#xff0c;你可以把 grid 中的 一个 1 变成 0 。 如果一个矩阵中&#xff0c;没有 1 与其它的 1 四连通&#xff08;也就是说所有 1 在上下左右四个方向上不能与其他 1 相邻&#xff09;&#x…...

MySQL高可用集群

https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html 1 什么是MySQL高可用集群 MySQL高可用集群&#xff1a;MySQL InnoDB ClusterInnoDB Cluster是MySQL官方实现高可用读写分离的架构方案&#xff0c;包含以下组件 MySQL Group Replication&#xff1a;简…...

day14 leetcode-hot100-27(链表6)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 1. 暴力法 思路 创建一个空节点&#xff0c;用来组装这两个链表&#xff0c;谁小谁就是下一个节点。 知识 创建空节点&#xff1a;ListNode n1 new ListNode(-1); 具体代码 /*** Definition for singly-l…...

YOLOv5 :训练自己的数据集

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 我们接着上一篇文章配置完YOLOv5需要的环境后&#…...

flutter项目迁移空安全

重中之重 备份好项目文件&#xff0c;甚至连已经加载好的flutter库也可以备份。环境包升级 2.1 不要直接换成flutter:3.0以上的版本&#xff0c;这样做既有基本的库兼容问题&#xff0c;又有空安全下的语法问题(整个项目中需要增加 late、?、!的语法错误&#xff0c;一片报错的…...

vue element日期范围选择器只能选择指定天数内的

<el-date-pickerv-model"dateRange"type"daterange"range-separator"至"start-placeholder"开始日期"end-placeholder"结束日期"format"yyyy-MM-dd"value-format"yyyy-MM-dd"clearable:picker-optio…...

从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)

五、RabbitMQ 工作原理全揭秘 在深入了解了 RabbitMQ 的核心组件之后&#xff0c;接下来让我们深入探究 RabbitMQ 的工作原理&#xff0c;揭开其在消息生产、投递、消费以及可靠性保障等方面的神秘面纱。 5.1 消息生产与投递流程 建立连接与信道&#xff1a;生产者首先通过 …...

MySql(十二)

目录 MySql约束 1.添加主键约束 语法格式 1&#xff09;创建一个带主键的表 查看表结构 2&#xff09;创建表的时候指定主键名称 查看表结构 3&#xff09;创建一个表然后&#xff0c;然后再使用alter为列添加主键 查看表结构 4&#xff09;为表添加数据 1---正常数据 2---主键…...