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

【 c 语言 】指针入门

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【 c 语言 】指针入门

  • 一 内存地址
    • 1.1 概念
    • 1.2 类比
    • 1.3 c 语言 存储一个变量的过程
  • 二 指针的概念
    • 2.1 概念
    • 1.2 类比
  • 三 声明指针变量
  • 四 指针的赋值操作
    • 4.1 变量地址赋值给指针
    • 4.2 改变指针的指向
  • 五 通过指针访问和修改内存中的数据
  • 总结

引言:

在计算机科学的世界里,指针是一个至关重要且经常令人困惑的概念。尤其是在C语言的学习过程中,指针的掌握程度往往决定了编程能力的高低。指针不仅可以帮助我们更深入地理解计算机内存的工作原理,还能大大提高程序的执行效率。

然而,由于其抽象性和复杂性,许多初学者对指针感到畏惧。今天,我们就来揭开指针的神秘面纱,以简洁易懂的方式带领大家走进C语言指针的世界。

在这篇博客中,我们将从内存地址的基本概念入手,逐步深入讲解指针的概念、声明、赋值操作,以及如何通过指针访问和修改内存中的数据。希望通过这篇博客,能够帮助大家建立起对指针的直观认识,为后续的学习和实践打下坚实的基础。

在这里插入图片描述

一 内存地址

1.1 概念

计算机内存地址是计算机体系结构中的重要概念之一,它指的是计算机内存中存储数据的位置。在计算机运行程序时,需要将程序和数据加载到内存中,程序通过访问内存地址来读取和写入数据。

因此,计算机内存地址是程序运行的关键,也是操作系统、编译器和计算机硬件设计的重要基础。

内存被划分为一系列连续的存储单元,每个存储单元都有一个唯一的地址,这些地址可以看作是内存中的房间号,用于定位和访问存储单元中的数据。

内存地址通常用十六进制表示,例如0x0000、0x0001、0x0002等。

每个地址对应一个存储单元,存储单元的大小由计算机架构决定,常见的存储单元大小包括字节(Byte)、字(Word)等。

当CPU需要访问内存时,它会向内存控制器发出地址信号,内存控制器会根据地址信号将数据发送到数据总线上,CPU通过数据总线读取或写入内存中的数据。

由于每个内存地址都对应着一段物理存储空间,计算机可以通过内存地址来访问任意位置的内存,这也是计算机高速访问数据的关键之一。

此外,计算机内存地址的大小决定了计算机可以寻址的内存容量。

在32位计算机中,内存地址由32位二进制数表示,最大可以寻址2^32个内存单元,即4GB。而在64位计算机中,内存地址的位数和寻址能力会更大。

总的来说,计算机内存地址是计算机内存管理的基础,它使得计算机能够高效、准确地访问和操作内存中的数据。

1.2 类比

内存地址的概念可以通过现实生活中的一些例子进行类比,以帮助我们更好地理解和记忆。

以下是一个简单的类比:

类比:图书馆的书架与书籍

假设我们把计算机的内存想象成一个大型的图书馆,图书馆里有很多书架,每个书架都有唯一的编号(这就像是内存地址)。而书架上的每一格都用来放置一本书(这就像是内存单元)。

1 书架编号(内存地址):

每个书架都有一个独特的编号,用来标识它的位置。

这个编号就像内存地址一样,用于快速定位到特定的书架。

2 书籍(数据):

书架上的每一格都放有一本书,这本书包含了特定的信息(数据)。

同样地,内存单元中存储着特定的数据,这些数据可以是变量、程序指令等。

3 查找书籍(访问内存):

当你想找一本书时,你会根据书架的编号找到对应的书架,然后在书架上找到你想要的书籍。

这个过程类似于计算机访问内存的过程:CPU根据内存地址找到对应的内存单元,然后读取或写入数据。

4 书架大小与格子数量(内存大小和单元数量):

图书馆中可能有多个不同大小的书架,每个书架的格子数量也不同。

这类似于计算机内存的大小和内存单元的数量。内存越大,可以存储的数据就越多。

通过这个类比,我们可以将复杂的内存地址概念转化为更容易理解的现实生活场景。书架的编号对应着内存地址,书籍对应着存储在内存中的数据,而查找书籍的过程则类似于计算机访问内存的过程。

需要注意的是,这个类比只是为了帮助理解内存地址的概念,实际的计算机内存结构和操作要复杂得多。但在初学阶段,这样的类比可以帮助我们建立起对内存地址的直观认识。

1.3 c 语言 存储一个变量的过程

假如我们定义了一个整型变量10,这个变量在计算机里是怎么存储的呢?

int x = 10;

在大多数现代计算机系统中,整数变量int x = 10;在内存中的存放方式通常取决于计算机的字长(word size)以及该系统的内存模型。

字长是计算机处理数据的基本单位大小,通常与CPU的寄存器大小相匹配。常见的字长有32位和64位。

以下是一个简化的例子,说明在32位系统上int x = 10;是如何在内存中存放的:

1 变量声明:

首先,在程序中声明了一个整型变量x。

2 内存分配:

当程序运行时,编译器或运行时环境会为变量x在内存中分配一个存储位置。

这个存储位置是一个连续的字节块,其大小足以容纳一个整数。在32位系统上,一个int类型通常占用4个字节(32位)。

3 值存放:

变量x被初始化为值10。这个值会按照计算机的内存模型以二进制形式存放在分配的内存位置中。

在二进制中,整数10表示为1010。但是,由于一个整数在内存中通常使用补码形式表示,并且需要填充到足够的位数(在这个例子中是32位),所以实际的存储形式会有所不同。

对于正数10,其32位补码表示是:00000000 00000000 00000000
00001010。这32位中的每一位都对应内存中的一个位(bit)。

4 内存地址:

这块存储整数10的内存有一个唯一的地址。

这个地址在程序运行时由操作系统或运行时环境管理,并且通常对程序员是不可见的,除非使用指针或特定的调试工具。

在64位系统上,情况类似,但int类型可能仍然占用4个字节(这取决于具体的编程语言和编译器),或者它可能占用8个字节以匹配系统的字长。实际的存储大小取决于C或C++标准库的实现,或者其他编程语言的规范。

在小端字节序系统中,这个32位的数值会按照从最低有效位(LSB)到最高有效位(MSB)的顺序存储。因此,这四个字节会按照以下方式存放在内存中:

内存地址   存储内容(十六进制表示)  
0x1000     10          (最低有效字节)  
0x1001     00  
0x1002     00  
0x1003     00          (最高有效字节,对于小数值通常是0)

在这个例子中,变量x的值10被存储在了从地址0x1000开始的四个连续字节中。每个地址对应一个字节,而整数10的二进制表示被填充并分布在这四个字节中。由于10是一个很小的数,它的高位都是0,所以在高地址字节中存储的都是0。

二 指针的概念

在上面呢,我们了解了内存地址的概念,内存地址本质上就是一段数字,就像整数类型,浮点数类型,字符类型一样,它指的是一种数据类型,是一种变量,那么我们有没有具体数据类型来表示内存地址呢?有!那就是指针。

接下来让我们进入对指针的学习吧!

2.1 概念

在C语言中,指针是一个非常重要的概念,它提供了一种直接访问和操作内存地址的能力。

具体来说,指针是一个变量,但它并不存储实际的数据值,而是存储了另一个变量的内存地址。通过这个地址,我们可以间接地访问和操作该地址处的数据。

首先,指针与变量的关系非常密切。变量是用来存储数据的,而指针则是用来存储变量内存地址的。

我们可以将指针看作是一个“指向”变量的箭头,通过这个箭头,我们可以找到并操作变量的数据。

因此,指针实际上是对变量的一个引用或句柄。

其次,指针本身也是一种变量,它也需要占用一定的内存空间来存储地址信息。

这个内存空间的大小通常是固定的,与具体的机器和编译器有关。

另外,指针变量的类型决定了它所指向的数据类型。

例如,如果我们有一个指向整数的指针,那么它存储的就是一个整数的内存地址;如果我们有一个指向字符的指针,那么它存储的就是一个字符的内存地址。

指针的类型与其所指向的数据类型之间有着密切的关系。指针的类型决定了它所指向的数据的大小和解释方式。

例如,一个指向整数的指针会按照整数的大小和格式来解释它所指向的内存中的数据;

而一个指向字符的指针则会按照字符的大小和格式来解释数据。

这种类型关联性确保了当我们通过指针访问数据时,数据会被正确地解释和使用。

需要注意的是,指针的类型和它所指向的数据类型必须匹配,否则可能会导致错误的内存访问和数据解释。

因此,在使用指针时,我们需要确保指针的类型与其所指向的数据类型一致,以避免潜在的问题。

综上所述,指针是C语言中一个强大的工具,它允许我们直接操作内存地址,并提供了对数据的间接引用和操作能力。通过理解指针的概念、指针与变量的关系以及指针类型与数据类型的关联性,我们可以更好地掌握C语言中的指针用法,并编写出更加高效和灵活的程序。

1.2 类比

在现实生活中,我们可以将指针类比为一张写有地址的便签。

这张便签本身并不包含我们想要找的东西,但它提供了找到这个东西的线索——地址。

想象一下,你想要去一个朋友家玩,但你不知道他家具体在哪里。这时,你的朋友给你一张便签,上面写着他家的详细地址。这张便签就相当于一个指针,它指向了你朋友家的位置。

在这个类比中:

朋友家(数据)是你想要访问和交互的目标。
便签(指针)是存储地址信息的工具。
地址(内存地址)是找到朋友家的关键。

同样地,在C语言中:

变量(如朋友家)存储了实际的数据。
指针(如便签)存储了变量的内存地址。
内存地址(如地址信息)是找到并访问变量数据的途径。

当我们根据便签上的地址找到朋友家时,我们可以和朋友互动、聊天或玩耍(相当于在C语言中通过指针访问和修改变量的值)。

同样地,如果便签上的地址是错误的或者便签丢失了(相当于指针指向了错误的内存地址或指针未被正确初始化),我们就无法找到朋友家,甚至可能会走错地方(在C语言中可能导致程序出错或崩溃)。

因此,指针在C语言中的作用就像便签在现实生活中的作用一样,它们都是帮助我们找到和访问目标的重要工具,但使用不当也可能带来问题。

通过这个类比,我们可以更好地理解指针的概念和它在C语言中的作用。

三 声明指针变量

在C语言中,声明一个指针变量时,你需要指定三个主要部分:数据类型、指针运算符和变量名。

下面是对这三个部分的详细解释:

1 type(数据类型)

type 表示指针将指向的数据类型。

这可以是任何有效的C语言数据类型,如 int(整数)、char(字符)、float(浮点数)、double(双精度浮点数)、结构体类型、联合体类型等。指针的类型决定了它如何解释它所指向的内存中的数据。

例如,如果你声明一个 int 类型的指针,那么这个指针将被解释为指向整数的内存地址。

2 * (指针运算符)

" * " 是指针运算符,它用于声明指针变量。

在声明中,* 紧接在变量名之前,表示这个变量是一个指针,即它存储的是另一个变量的地址,而不是值。

当你使用 * 运算符与指针变量一起时(例如在赋值或解引用操作中),你正在访问或操作指针指向的内存位置的内容。

3 pointer_variable(指针变量名)

pointer_variable 是你给指针变量起的名字。这个名字用于在代码中引用和操作这个指针变量。

你可以像操作其他变量一样操作指针变量,包括给它赋值、传递给它参数等。

标准格式:

type *pointer_variable;

以下是一些具体的例子:

1 声明一个指向整数的指针:

int *ptr_int;

在这个例子中,ptr_int 是一个指向整数的指针。

它目前并不指向任何具体的整数,除非你给它赋值。

2 声明一个指向字符的指针:

char *ptr_char;

在这个例子中,ptr_char 是一个指向字符的指针。

同样,它目前并不指向任何具体的字符,除非你给它赋值。

3 声明一个指向浮点数的指针:

float *ptr_float;

在这个例子中,ptr_float 是一个指向浮点数的指针。

它目前并不指向任何具体的浮点数,除非你给它赋值。

当你声明了一个指针变量后,你需要给它分配一个地址,让它指向某个具体的变量或内存位置。这通常是通过使用 & 运算符(取地址运算符)或者通过动态内存分配(如 malloc 或 calloc)来实现的。

例如:

int num = 10;  
int *ptr_int = #  // ptr_int 现在指向 num 的地址

在这个例子中,ptr_int 被赋值为 num 的地址,所以 ptr_int 现在指向 num。你可以通过 *ptr_int 来访问或修改 num 的值。

四 指针的赋值操作

在C语言中,指针是一种特殊的变量,它存储的是另一个变量的内存地址,而不是实际的值。

指针的赋值操作有两种主要情况:一是将变量的地址赋值给指针,二是改变指针的指向。

首先,我们来看如何将变量的地址赋值给指针:

4.1 变量地址赋值给指针

当我们说一个指针指向某个变量的地址时,我们实际上是将该变量的内存地址赋值给指针。

这通常通过使用取地址操作符 & 来实现,该操作符返回其操作数的内存地址。

下面是一个简单的C语言代码示例,演示了如何使指针指向变量的地址,并输出这个地址:

#include <stdio.h>  int main() {  int variable = 42;  // 定义一个整型变量并初始化  int *pointer;       // 定义一个整型指针  // 让指针指向变量的地址  pointer = &variable;  // 输出指针指向的地址  printf("The address of variable is: %p\n", (void *)pointer);  return 0;  
}

运行结果:

The address of variable is: 0x7ffeecbc

分析:

int variable = 42; 

这行代码定义了一个整型变量 variable 并将其初始化为 42。

 int *pointer; 

这行代码定义了一个整型指针 pointer。此时 pointer 并未初始化,它可能指向任何随机的内存地址。

 pointer = &variable; 

这行代码是关键。这里使用了取地址操作符 & 来获取 variable的内存地址,并将这个地址赋值给 pointer。现在 pointer 指向 variable 的内存地址。

 printf("The address of variable is: %p\n", (void *)pointer); 

这行代码输出了 pointer 所指向的地址。

%p 是用来输出指针地址的格式说明符,并且需要将指针强制转换为 void * 类型来匹配格式说明符。这是因为 void * 是一个通用指针类型,可以指向任何类型的数据。

注意:每次运行程序时,variable 的内存地址都可能不同,因为它是由操作系统在运行时动态分配的。

4.2 改变指针的指向

在C语言中,改变指针的指向意味着将指针变量重新赋值为一个新的地址。

这通常是通过赋值操作符 = 来实现的,新值应该是一个有效的内存地址。

以下是一个代码示例,它演示了如何改变指针的指向,并输出原数值、原地址、新数值和新地址:

#include <stdio.h>  int main() {  int originalValue = 10;  // 原数值  int newValue = 20;       // 新数值  int *pointer;            // 定义指针  // 初始时,指针指向原数值的地址  pointer = &originalValue;  printf("原数值:%d\n", *pointer);       // 输出原数值  printf("原地址:%p\n", (void *)pointer); // 输出原地址  // 改变指针指向,使其指向新数值的地址  pointer = &newValue;  printf("新数值:%d\n", *pointer);       // 输出新数值  printf("新地址:%p\n", (void *)pointer); // 输出新地址  return 0;  
}

运行结果可能类似于:

原数值:10  
原地址:0x7ffeecbc  
新数值:20  
新地址:0x7ffeecbc+4

分析:

这段代码首先定义了两个整型变量originalValue和newValue,分别赋值为10和20。

然后定义了一个整型指针pointer。

接着,将pointer指向originalValue的地址,并通过*pointer输出原数值,同时输出pointer所指向的原地址。

之后,改变pointer的指向,使其指向newValue的地址,并输出新数值和新地址。

整个程序通过改变指针的指向,展示了指针如何与内存地址相关联,并如何通过指针访问和修改变量的值。

通过上面的代码和解释,我们可以清晰地看到如何改变指针的指向,并通过输出原数值、原地址、新数值和新地址来验证这一操作。

在C语言中,指针的指向可以随时改变,这使得指针在动态内存管理、数组操作、函数参数传递等场景中非常有用。

然而,也需要注意,改变指针指向后,原指向的内存地址(如果不再使用)可能不再有效,需要谨慎处理以避免内存泄漏或野指针等问题。

五 通过指针访问和修改内存中的数据

在C语言中,指针是一个变量,它存储的是内存地址而不是实际的值。通过指针,我们可以直接访问和修改内存中的数据。下面是一个简单的例子来说明如何通过指针访问和修改内存中的数据。

首先,我们创建一个整数变量并赋予它一个值:

int var = 10;

此时,var 变量在内存中有一个特定的地址。为了访问这个地址,我们可以定义一个指向整数的指针,并将 var 的地址赋给它:

int *ptr = &var;

在上面的代码中,&var 是一个取地址操作符,它返回 var 变量的内存地址。

然后,我们将这个地址赋给名为 ptr 的指针变量。现在,ptr 包含了 var 的内存地址。

要通过指针访问 var 的值,我们可以使用解引用操作符 *:

printf("The value of var is: %d\n", *ptr);

在上述代码中,*ptr 表示访问 ptr 所指向的内存地址中的值,即 var 的值。

因此,输出将是 The value of var is: 10。

接下来,我们可以通过指针修改 var 的值:

*ptr = 20;  
printf("The new value of var is: %d\n", var);

在上述代码中,我们将 *ptr(即 var 的值)设置为 20。

因此,var 的值现在变为 20,输出将是 The new value of var is: 20。

这就是通过指针访问和修改内存中的数据的基本方法。请注意,指针操作需要谨慎处理,因为错误的指针操作可能导致内存泄漏、数据损坏或其他未定义的行为。因此,在使用指针时,请确保您了解它们的用法和限制。

总结

通过本次对C语言指针的入门学习,我们了解了指针的基本概念、声明方式以及赋值操作。

指针作为连接变量和内存地址的桥梁,为我们提供了直接操作内存数据的可能。

掌握指针的使用不仅可以帮助我们深入理解计算机内存的运作机制,还能提升编程效率,优化程序性能。当然,指针也是一把双刃剑,不当的使用可能会导致内存泄漏、数据混乱等问题。

因此,在使用指针时,我们必须格外小心,确保每一次操作都符合预期。希望本篇博客能够帮助大家更好地理解和使用指针,为后续的编程之路奠定坚实的基础。

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

相关文章:

【 c 语言 】指针入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Swiper)

滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-2、线条平滑曲面(原始颜色)但不去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…...

win10 + cpu + pycharm + mindspore

MindSpore是华为公司自研的最佳匹配昇腾AI处理器算力的全场景深度学习框架。 1、打开官网&#xff1a; MindSpore官网 2、选择以下选项&#xff1a; 3、创建conda 环境&#xff0c;这里python 选择3.9.0&#xff0c;也可以选择其他版本&#xff1a; conda create -c conda-…...

设计一个生产制造系统100问?

设计一个生产制造系统时&#xff0c;首先需要明确系统的目标和范围。生产制造系统的设计应该从产品需求和生产流程出发&#xff0c;结合现代科技手段&#xff0c;构建一个高效、智能、可持续的生产制造系统。 你的生产制造系统是针对哪种产品或产品类型设计的&#xff1f;系统需…...

LeetCode 面试经典150题 26.删除有序数组中的重复项

题目&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量…...

海豚调度系列之:集群部署(Cluster)

海豚调度系列之&#xff1a;集群部署Cluster 一、前置准备工作二、准备 DolphinScheduler 启动环境1.配置用户免密及权限2.配置机器 SSH 免密登陆3.启动 zookeeper4.初始化数据库5.修改相关配置5.修改 dolphinscheduler_env.sh 文件 三、启动DolphinScheduler四、登录 DolphinS…...

居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)

居民健康监测小程序目录 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…...

【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录 1 -> 排序的概念及其运用 1.1 -> 排序的概念 1.2 -> 常见的排序算法 2 -> 插入排序 2.1 -> 基本思想 2.2 -> 直接插入排序 2.2.1 -> 代码实现 2.3 -> 希尔排序(缩小增量排序) 2.3.1 -> 代码实现 1 -> 排序的概念及其运用 1.1 -&g…...

Docker环境快速搭建RocketMq

window上面安装&#xff1a; 1.Namesrv docker pull rocketmqinc/rocketmq创建C:/docker/rocketmq/data/namesrv/logs:/root/logs C:/docker/rocketmq/data/namesrv/store:/root/store 目录 namesrv: docker run -d --restartalways --name rmqnamesrv -p 9876:9876 -v C:/do…...

【leetcode热题】比较版本号

难度&#xff1a; 中等通过率&#xff1a; 22.1%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 比较两个版本号 version1 和 version2。 如果 version1 > version2 返回 1&#xff0c;如果 version1 < version2 返回 -1&#xff0c; 除此之外…...

【ArcGISPro】道路数据下载并使用

下载 下载链接: Geofabrik 下载服务器 这些数据通常 每天更新。 下载结果 arcmap用户下载工具 10.2:http://www.arcgis.com/home/item.html?id=16970017f81349548d0a9eead0ebba39 10.3:...

DataGrip 面试题及答案整理,最新面试题

DataGrip的数据库兼容性和多数据库支持如何实现&#xff1f; DataGrip实现数据库兼容性和多数据库支持的方式包括&#xff1a; 1、广泛的数据库支持&#xff1a; DataGrip支持多种数据库&#xff0c;包括但不限于MySQL, PostgreSQL, SQL Server, Oracle, SQLite, 和MongoDB&a…...

2、设计模式之单例模式详解(Singleton)

单例模式详解 一、什么是单例模式 单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式&#xff0c;它提供了一种访问对象的最佳方式。 这种设计模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建。这个…...

【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值

【django framework】ModelSerializerGenericAPIView&#xff0c;如何在提交前修改某些字段值 我们经常会遇到下面这种情况&#xff1a; 序列化器用的是ModelSerializer&#xff0c;写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之…...

2024年【P气瓶充装】模拟考试及P气瓶充装证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装模拟考试是安全生产模拟考试一点通生成的&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材汇编出P气瓶充装仿真模拟考试。2024年【P气瓶充装】模拟考试及P气瓶充装证考试 1、【多选题】《中华…...

<JavaEE> 数据链路层 -- 以太网协议、MTU限制、ARP协议

目录 以太网协议 什么是以太网&#xff1f; 以太网的帧格式 什么是MAC地址&#xff1f; MAC地址和IP地址的对比&#xff1f; MTU&#xff08;最大传输单元&#xff09;限制 什么是MTU限制&#xff1f; MTU对IP协议有什么影响&#xff1f; MTU对UDP协议有什么影响&…...

认识Testbench仿真激励

一、认识Testbench Bench有平台之意&#xff0c;所以Testbench就是测试平台的意思。 任何一个被测模块&#xff0c;都有输入和输出&#xff0c;此模块是否合格的判断依据&#xff0c;就是在满足输入要求的情况下&#xff0c;能否得到符合预期的输出。我们把被测模块称作UUT&…...

Postman请求API接口测试步骤和说明

Postman请求API接口测试步骤 本文测试的接口是国内数智客&#xff08;www.shuzike.com&#xff09;的API接口手机三要素验证&#xff0c;验证个人的姓名&#xff0c;身份证号码&#xff0c;手机号码是否一致。 1、设置接口的Headers参数。 Content-Type&#xff1a;applicati…...

这是二叉搜索树吗?

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树&#xff1a;对于任一结点&#xff0c; 其左子树中所有结点的键值小于该结点的键值&#xff1b;其右子树中所有结点的键值大于等于该结点的键值&#xff1b;其左右子树都是二叉搜索树。 所谓二叉搜索树的“镜像”&#xf…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...