自学-C语言-基础-数组、函数、指针、结构体和共同体、文件

news2025/4/8 7:11:33

这里写自定义目录标题

  • 代码环境:
  • ?问题思考:
  • 一、数组
  • 二、函数
  • 三、指针
  • 四、结构体和共同体
  • 五、文件
  • 问题答案:

代码环境:

Dev C++

?问题思考:

把上门的字母与下面相同的字母相连,线不能相交,不能碰到框。(文章末尾有答案)不要觉得不可能,请先思考思考。
在这里插入图片描述

一、数组

C语言中的数组是存储相同类型数据的集合,数组的元素可以通过下标访问。

  1. 数组的声明
    数组声明时,必须指定数组的类型和大小。例如:
int arr[5]; // 声明一个包含5个整数的数组
char str[20]; // 声明一个包含20个字符的字符数组
  1. 数组的初始化
    数组可以在声明时进行初始化。可以通过直接指定值来初始化数组:
int arr[5] = {1, 2, 3, 4, 5}; // 初始化数组

如果元素少于数组的大小,剩余的元素会被默认初始化为0:

int arr[5] = {1, 2}; // arr = {1, 2, 0, 0, 0}
  1. 数组的访问
    数组元素通过下标访问,下标从0开始。例如:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d", arr[2]); // 输出3
  1. 多维数组
    C语言支持多维数组。二维数组(常用于矩阵)是最常见的多维数组:
int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

访问二维数组时,可以用两个下标:

printf("%d", matrix[1][2]); // 输出6
  1. 数组作为函数参数
    数组可以作为函数参数传递。当传递数组时,实际上传递的是数组的指针,而不是数组的副本。例如:
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    printArray(arr, 5); // 调用函数并传递数组
}
  1. 数组与指针的关系
    在C语言中,数组名本质上是一个指向数组首元素的指针。因此,数组和指针有很多相似之处:
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("%d", *(ptr + 2)); // 输出3
  1. 动态数组
    C语言没有内建的动态数组功能,但可以通过mallocfree函数来手动管理内存,创建和销毁动态数组。例如:
int *arr = (int *)malloc(5 * sizeof(int)); // 动态申请内存
arr[0] = 1;
arr[1] = 2;
// 其他操作
free(arr); // 释放内存
  1. 常见操作
  • 数组长度:C语言没有内建的函数来获取数组的长度,但可以通过sizeof操作符计算数组的大小:
int arr[5];
int len = sizeof(arr) / sizeof(arr[0]); // 计算数组的长度
  • 数组遍历:可以使用for循环遍历数组:
for (int i = 0; i < 5; i++) {
    printf("%d ", arr[i]);
}

二、函数

C语言中的函数是执行特定任务的代码块,通过调用函数可以实现代码的复用。

  1. 函数的基本概念
    函数是一段可以被反复调用的代码。函数的定义通常包含返回类型、函数名称、参数列表和函数体。
return_type function_name(parameter_list) {
    // 函数体
    // 执行任务
    return return_value; // 如果有返回值
}
  1. 函数的声明
    在使用函数之前,通常需要声明函数。函数声明告诉编译器函数的返回类型、名称以及参数类型。函数声明通常放在源文件的顶部或头文件中。
int add(int, int); // 函数声明
  1. 函数的定义
    函数定义包括函数的返回类型、名称、参数及函数体。函数体包含执行任务的代码。
int add(int a, int b) {
    return a + b; // 函数实现
}
  1. 函数的调用
    在程序的其他部分,调用函数来执行定义的任务。调用时需要提供必要的参数(如果有)。
int result = add(3, 5); // 调用函数
printf("%d", result); // 输出 8
  1. 函数的返回类型
    函数可以返回一个值,也可以不返回值。常见的返回类型有 int, float, char, void 等。
  • 返回值类型:函数定义时,返回类型指定了函数返回数据的类型。
int multiply(int a, int b) {
    return a * b; // 返回int类型
}
  • void函数:如果函数没有返回值,使用 void 作为返回类型。
void printMessage() {
    printf("Hello, World!");
}
  1. 参数传递
    C语言中有两种方式传递参数:值传递地址传递
  • 值传递:在函数调用时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参。
void addFive(int num) {
    num = num + 5;
}
int main() {
    int n = 10;
    addFive(n); // n不会改变,仍为10
}
  • 地址传递(引用传递):使用指针将变量的地址传递给函数,函数可以通过指针修改实际参数。
void addFive(int *num) {
    *num = *num + 5;
}
int main() {
    int n = 10;
    addFive(&n); // n变为15
}
  1. 递归函数
    递归是指一个函数在其定义中调用自身。递归通常用于解决可以分解为子问题的问题,如阶乘、斐波那契数列等。
int factorial(int n) {
    if (n == 0) return 1; // 递归基准条件
    else return n * factorial(n - 1); // 递归调用
}
  1. 函数的作用域与生命周期
  • 局部变量:在函数内部声明的变量,作用范围仅限于该函数。局部变量在函数调用时创建,返回后销毁。
  • 全局变量:在函数外部声明的变量,整个程序范围内都可访问。全局变量在程序运行期间一直存在。
int globalVar = 100; // 全局变量

void foo() {
    int localVar = 50; // 局部变量
    printf("%d", localVar);
}
  1. 函数指针
    函数指针是指向函数的指针。通过函数指针,可以在运行时动态决定调用哪个函数,常用于回调函数和事件驱动编程。
#include <stdio.h>

void greet() {
    printf("Hello!");
}

int main() {
    void (*func_ptr)() = greet; // 声明函数指针
    func_ptr(); // 通过函数指针调用函数
    return 0;
}
  1. 内存管理与函数
    C语言中的函数并不会自动处理内存的分配和释放,程序员必须显式地管理内存。常用的内存管理函数有 malloc, free, calloc, realloc 等。
#include <stdlib.h>

int* createArray(int size) {
    int *arr = (int*)malloc(size * sizeof(int)); // 动态分配内存
    return arr;
}

int main() {
    int *arr = createArray(10); // 分配10个整数的内存
    free(arr); // 释放内存
    return 0;
}
  1. 可变参数函数
    C语言允许函数接收可变数量的参数,这类函数一般使用 stdarg.h 库。常见的例子是 printf 函数。
#include <stdarg.h>
#include <stdio.h>

void printNumbers(int num, ...) {
    va_list args;
    va_start(args, num);
    
    for (int i = 0; i < num; i++) {
        printf("%d ", va_arg(args, int)); // 获取下一个参数
    }
    va_end(args);
}

int main() {
    printNumbers(3, 10, 20, 30); // 输出: 10 20 30
}
  1. 函数的调用约定
    不同的编译器和平台可能使用不同的调用约定。常见的调用约定有 cdecl, stdcall 等,它们定义了如何传递参数、如何清理堆栈等。

三、指针

C语言中的指针是一个非常重要的概念,它允许程序直接操作内存。掌握指针的使用对于理解C语言的内存管理、函数调用、数组等方面非常有帮助。

  1. 指针的基本概念
    指针是一个变量,它存储的是另一个变量的地址。指针允许我们通过地址来访问和操作内存中的数据。
  • 声明指针:指针的声明需要在类型后加上一个星号(*)来表示该变量是一个指针。
int *ptr; // 声明一个指向int类型的指针
  • 指针变量:指针变量存储的是另一个变量的地址,而不是值本身。
  1. 指针的初始化与赋值
    指针必须被初始化才能使用,通常通过取地址符(&)来获取变量的地址。
int num = 10;
int *ptr = &num; // 指针ptr指向num的地址
  1. 间接访问(解引用)
    通过指针可以访问其指向的变量。这个过程称为解引用,通过星号(*)操作符来进行。
int num = 10;
int *ptr = &num; // ptr存储num的地址
printf("%d", *ptr); // 输出num的值,即10
  1. 指针与变量
    指针本身是一个变量,它保存了另一个变量的地址。通过指针可以修改指向的变量的值。
int num = 10;
int *ptr = &num;
*ptr = 20; // 通过指针修改num的值
printf("%d", num); // 输出20
  1. 指针与数组
    数组名本质上是一个指向数组首元素的指针,因此可以通过指针操作数组。
int arr[3] = {1, 2, 3};
int *ptr = arr;
printf("%d", *(ptr + 1)); // 输出2,ptr指向arr[0],*(ptr + 1)指向arr[1]
  1. 指针运算
    指针支持一些基本的运算,例如指针加减法。指针加法会根据指针所指向的数据类型自动调整步长。例如,int *ptr 加1,实际上会跳过一个int的空间(通常是4字节)。
int arr[3] = {1, 2, 3};
int *ptr = arr;
ptr++; // 指针ptr移动到arr[1]
printf("%d", *ptr); // 输出2
  1. 空指针
    空指针是指不指向任何有效内存位置的指针。它常用于初始化指针变量,以避免它指向不确定的内存地址。空指针常用的值是NULL
int *ptr = NULL; // 空指针
if (ptr == NULL) {
    printf("指针为空\n");
}
  1. 指向指针的指针(多级指针)
    指针本身可以指向另一个指针,这称为多级指针。常见的如二级指针、三级指针等。
int num = 10;
int *ptr = &num;
int **ptr2 = &ptr; // ptr2指向ptr,ptr指向num
printf("%d", **ptr2); // 输出10
  1. 指针与函数
    指针在函数中的使用非常广泛,常用于传递大块数据(如数组),或者通过指针修改函数外部的变量值。
  • 指针作为函数参数:传递指针到函数,允许在函数内修改外部变量。
void increment(int *ptr) {
    (*ptr)++;
}

int main() {
    int num = 10;
    increment(&num); // 传递num的地址
    printf("%d", num); // 输出11
}
  • 返回指针的函数:函数可以返回指向局部变量的指针,但这样做是危险的,因为局部变量在函数返回后会被销毁。
int* foo() {
    int num = 10;
    return &num; // 返回局部变量的地址,不建议这么做
}
  1. 指针数组
    指针数组是一个数组,其中每个元素都是指针。例如,可以创建一个指向多个字符串的数组。
char *arr[] = {"Hello", "World"};
printf("%s", arr[1]); // 输出 "World"
  1. 常量指针与指针常量
  • 常量指针:指向的内容不能被修改,但指针本身可以指向其他地址。
int num = 10;
int *const ptr = &num; // 常量指针
*ptr = 20; // 允许修改ptr指向的内容
ptr = &num2; // 错误,无法修改指针的地址
  • 指针常量:指针本身不能修改,但可以通过指针修改它所指向的内容。
int num = 10;
const int *ptr = &num; // 指针常量
*ptr = 20; // 错误,无法修改ptr指向的内容
ptr = &num2; // 允许修改指针的地址
  1. 指针与动态内存分配
    C语言通过malloc, calloc, realloc, 和 free来动态分配和释放内存。使用指针操作动态分配的内存。
#include <stdlib.h>

int *ptr = (int *)malloc(10 * sizeof(int)); // 动态分配内存
if (ptr != NULL) {
    ptr[0] = 5;
    printf("%d", ptr[0]);
    free(ptr); // 释放内存
}
  1. 指针的内存布局
    指针类型的大小通常是固定的,依赖于平台(例如,32位系统上通常是4字节,64位系统上通常是8字节)。指针本身只存储地址信息。

  2. 指针的安全性
    指针操作不当可能导致以下问题:

  • 野指针:指向无效或未初始化的内存区域,可能导致程序崩溃或数据丢失。
  • 内存泄漏:动态分配的内存未释放,导致内存浪费。
  • 缓冲区溢出:对指针操作时,超出内存边界,可能会破坏数据或导致程序异常。

因此,在使用指针时,务必注意指针的初始化、使用和内存的正确管理。

四、结构体和共同体

C语言中的结构体(struct)和共用体(union)是用于存储不同类型数据的复合数据类型,它们具有各自的特点和用途。

  1. 结构体(struct
    结构体是一个用户自定义的数据类型,它允许将不同类型的数据组合在一起。每个数据成员称为结构体的字段或成员。

1.1 结构体的定义
结构体通过struct关键字定义,并且可以包含不同类型的成员。

struct Person {
    char name[50];
    int age;
    float height;
};

1.2 结构体的声明与初始化
结构体可以通过结构体名来声明变量,并且可以通过指定字段名来初始化。

struct Person person1; // 声明结构体变量

// 初始化结构体变量
struct Person person2 = {"John", 25, 175.5};

结构体变量可以直接通过点(.)运算符访问其成员:

printf("Name: %s\n", person2.name);
printf("Age: %d\n", person2.age);

1.3 结构体指针
结构体变量也可以通过指针来访问。通过结构体指针访问成员时,使用箭头(->)运算符。

struct Person *ptr = &person2;
printf("Name: %s\n", ptr->name); // 使用箭头运算符访问结构体成员

1.4 结构体作为函数参数
结构体可以作为函数的参数传递。通常有两种方式:

  • 按值传递:传递结构体的副本。
  • 按指针传递:传递结构体的地址,可以修改结构体的内容。
// 按值传递
void printPerson(struct Person p) {
    printf("Name: %s\n", p.name);
    printf("Age: %d\n", p.age);
}

// 按指针传递
void updateAge(struct Person *p) {
    p->age = 30;
}

1.5 结构体的大小
结构体的大小取决于它的成员以及内存对齐要求。内存对齐是为了提高处理器访问数据的效率,通常结构体的每个成员按照最大类型对齐方式来分配内存。

printf("Size of Person: %zu bytes\n", sizeof(struct Person));
  1. 共用体(union
    共用体是一个特殊的结构体,所有成员共享同一块内存区域,因此共用体的大小是其最大成员的大小。共用体中的每个成员都可以存储值,但任何时刻只能有一个成员被使用。

2.1 共用体的定义
共用体通过union关键字定义,它的成员共享同一块内存。

union Data {
    int i;
    float f;
    char str[20];
};

2.2 共用体的声明与初始化
共用体声明后,它会分配足够大的内存空间来存储最大的成员。

union Data data1;
data1.i = 10;
printf("i: %d\n", data1.i); // 输出i: 10

在同一个时间,只能访问一个成员。如果你修改一个成员的值,其他成员的值可能会被覆盖。

union Data data2;
data2.f = 3.14;
printf("f: %.2f\n", data2.f); // 输出f: 3.14
data2.i = 100;
printf("i: %d\n", data2.i); // 输出i: 100,str被覆盖

2.3 共用体的大小
共用体的大小等于其最大成员的大小,因为所有成员共享同一块内存区域。

printf("Size of Data: %zu bytes\n", sizeof(union Data));
  1. 结构体与共用体的区别
  • 内存分配:结构体的每个成员都有独立的内存空间,而共用体的所有成员共享同一块内存区域。
  • 大小:结构体的大小是所有成员大小之和,而共用体的大小是其最大成员的大小。
  • 使用场景:结构体用于需要存储多个不同类型的数据并且这些数据同时有效的场景,而共用体用于在同一时间只需要存储一个成员的值的场景,节省内存空间。
  1. 结构体与共用体的结合使用
    可以在结构体中嵌套共用体,也可以在共用体中嵌套结构体。这种方式常用于实现具有多种类型数据的复合数据结构。
struct Mixed {
    int x;
    union {
        int i;
        float f;
    } data;
};

struct Mixed example;
example.x = 5;
example.data.i = 10; // 或者example.data.f = 3.14;
  1. 位域(Bit-fields)
    结构体中的位域是通过指定成员的位数来控制内存的精确分配。位域成员通常用于需要节省内存的场景。
struct Person {
    unsigned int age : 7;  // 7位来表示年龄
    unsigned int gender : 1;  // 1位来表示性别
};

位域成员的总和不能超过一个int类型的大小。位域可以指定某个数据成员占用的位数,通常用于硬件寄存器映射等场景。

  1. 结构体指针和共用体指针
    指向结构体和共用体的指针操作是相似的。可以使用指针访问结构体或共用体的成员,但指向结构体的指针和指向共用体的指针在访问时有所不同。
struct Person *ptr = &person1;
ptr->age = 30;  // 修改结构体成员

union Data *ptr2 = &data1;
ptr2->i = 100;  // 修改共用体成员
  1. 结构体与共用体的使用场景
  • 结构体:结构体广泛用于需要同时存储多个不同类型数据的场景。例如,存储学生信息(姓名、年龄、成绩等)。
  • 共用体:共用体适用于节省内存的场景,特别是当不同数据成员不会同时使用时。例如,用于处理不同类型的网络数据包,其中每个数据包类型的字段是不同的。

总结

  • 结构体适合存储多个不同类型的变量,并且每个成员可以独立地存储值。
  • 共用体用于节省内存,多个成员共享同一块内存空间,但同一时刻只能存储一个成员的值。
  • 位域提供了精细的内存控制,通常用于低级编程和硬件编程。

五、文件

在C语言中,文件操作是非常重要的一部分,它使得程序能够与外部存储设备(如硬盘)进行数据交换。C语言提供了一些标准库函数,用于打开、读写、关闭文件等操作。

  1. 文件的基本概念
    C语言中的文件操作通过文件指针来实现。文件指针是指向文件的指针,它包含了文件的信息(如文件的位置、状态等)。C语言标准库提供了一些函数来操作文件。

  2. 文件操作的基本流程
    在C语言中,文件操作的一般步骤如下:

  3. 打开文件

  4. 进行文件读写操作

  5. 关闭文件

  6. 文件指针
    文件指针是指向文件的指针,C语言中通过FILE类型来定义文件指针。使用标准库函数打开文件时,会返回一个文件指针。

FILE *file;
  1. 打开文件
    在C语言中,使用fopen函数打开文件,fopen函数返回一个指向文件的指针,打开文件的模式指定了文件操作的类型(如读、写、追加等)。

4.1 fopen函数

FILE *fopen(const char *filename, const char *mode);
  • filename:文件的名称(包括路径)。
  • mode:打开文件的模式,表示文件的访问权限。

常用的文件打开模式:

  • "r":以只读方式打开文件,文件必须存在。
  • "w":以写入方式打开文件,如果文件存在则覆盖,不存在则创建。
  • "a":以追加方式打开文件,如果文件不存在则创建。
  • "rb":以二进制模式打开文件进行只读操作。
  • "wb":以二进制模式打开文件进行写入操作。
  • "r+":以读写方式打开文件,文件必须存在。
  • "w+":以读写方式打开文件,如果文件存在则覆盖,不存在则创建。
  • "a+":以读写方式打开文件,文件不存在则创建,文件指针移到文件末尾。
  1. 关闭文件
    文件操作完成后,使用fclose函数关闭文件。关闭文件时,文件指针不再有效。
int fclose(FILE *file);
  1. 文件读取
    文件读取操作常用的函数包括fgetcfgetsfread等。

6.1 fgetc函数
fgetc用于读取一个字符,并返回该字符。如果文件结尾则返回EOF(End Of File)。

int fgetc(FILE *file);

6.2 fgets函数
fgets用于从文件中读取一行数据,直到遇到换行符或文件结尾。fgets会在读取的字符串末尾添加\0

char *fgets(char *str, int num, FILE *file);
  • str:读取的字符串存储位置。
  • num:要读取的最大字符数。
  • file:文件指针。

6.3 fread函数
fread用于从文件中读取指定大小的数据块,通常用于二进制文件的读取。

size_t fread(void *ptr, size_t size, size_t count, FILE *file);
  • ptr:指向存储读取数据的内存区域。
  • size:每个数据块的字节数。
  • count:要读取的数据块数量。
  1. 文件写入
    文件写入操作常用的函数包括fputcfputsfprintffwrite等。

7.1 fputc函数
fputc用于将一个字符写入文件。

int fputc(int char, FILE *file);

7.2 fputs函数
fputs用于将字符串写入文件。

int fputs(const char *str, FILE *file);

7.3 fprintf函数
fprintf用于格式化输出到文件,类似于printf,但输出目标是文件。

int fprintf(FILE *file, const char *format, ...);

7.4 fwrite函数
fwrite用于将内存中的数据块写入文件,通常用于二进制文件的写入。

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *file);
  1. 文件位置指针操作
    文件指针用于记录文件中当前操作的位置。可以使用fseekftellrewind函数进行文件指针操作。

8.1 fseek函数
fseek用于设置文件指针的位置。

int fseek(FILE *file, long offset, int whence);
  • offset:文件指针偏移量。
  • whence:指定偏移的基准位置(SEEK_SETSEEK_CURSEEK_END)。

8.2 ftell函数
ftell返回文件指针的当前位置。

long ftell(FILE *file);

8.3 rewind函数
rewind将文件指针移动到文件的开头。

void rewind(FILE *file);
  1. 文件错误处理
    在文件操作过程中,可能会发生错误。C语言提供了以下函数来检测和处理文件错误。

9.1 feof函数
feof用于检测文件是否已到达结尾。

int feof(FILE *file);
  • 返回值:非零值表示已到达文件末尾,零表示未到达文件末尾。

9.2 ferror函数
ferror用于检测文件是否发生错误。

int ferror(FILE *file);
  • 返回值:非零值表示发生错误,零表示没有错误。
  1. 文件的读取与写入模式总结
    | 操作模式 | 说明 |
    |----------|-----------------------------|
    | "r" | 只读模式 |
    | "w" | 写模式,覆盖原文件或创建新文件 |
    | "a" | 追加模式 |
    | "r+" | 读写模式 |
    | "w+" | 读写模式,覆盖原文件或创建新文件 |
    | "a+" | 读写模式,追加内容 |
    | "rb" | 以二进制只读模式打开 |
    | "wb" | 以二进制写模式打开 |
    | "ab" | 以二进制追加模式打开 |
    | "r+b" | 以二进制读写模式打开 |

  2. 常见的文件操作示例
    示例1:读取文件内容并输出

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("File not found!\n");
        return 1;
    }

    char ch;
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch);
    }

    fclose(file);
    return 0;
}

示例2:将字符串写入文件

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fputs("Hello, world!\n", file);

    fclose(file);
    return 0;
}

C语言提供了强大的文件操作功能,能够帮助程序与外部存储设备进行数据交换。通过熟悉和掌握文件打开、读取、写入、关闭、指针操作和错误处理等基本操作,可以高效地进行文件操作。文件操作涉及的函数和模式非常丰富,可以满足各种需求。

问题答案:

你应该想到了吧?
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

蓝桥云客--团队赛

2.团队赛【算法赛】 - 蓝桥云课 问题描述 蓝桥杯最近推出了一项团队赛模式&#xff0c;要求三人组队参赛&#xff0c;并规定其中一人必须担任队长。队长的资格很简单&#xff1a;其程序设计能力值必须严格大于其他两名队友程序设计能力值的总和。 小蓝、小桥和小杯正在考虑报名…

C-S模式之实现一对一聊天

天天开心&#xff01;&#xff01;&#xff01; 文章目录 一、如何实现一对一聊天&#xff1f;1. 服务器设计2. 客户端设计3. 服务端代码实现4. 客户端代码实现5. 实现说明6.实验结果 二、改进常见的服务器高并发方案1. 多线程/多进程模型2. I/O多路复用3. 异步I/O&#xff08;…

[Deep-ML]Transpose of a Matrix(矩阵的转置)

Transpose of a Matrix&#xff08;矩阵的转置&#xff09; 题目链接&#xff1a; Transpose of a Matrix&#xff08;矩阵的转置&#xff09;https://www.deep-ml.com/problems/2 题目描述&#xff1a; 难度&#xff1a; easy&#xff08;简单&#xff09;。 分类&#…

智慧节能双突破 强力巨彩谷亚VK系列刷新LED屏使用体验

当前全球节能减排趋势明显&#xff0c;LED节能屏作为显示技术的佼佼者&#xff0c;正逐渐成为市场的新宠。强力巨彩谷亚万境VK系列节能智慧屏凭借三重技术保障、四大智能设计以及大师臻彩画质&#xff0c;在实现节能效果的同时&#xff0c;更在智慧显示领域树立新的标杆。   …

html 给文本两端加虚线自适应

效果图&#xff1a; <div class"separator">文本 </div>.separator {width: 40%;border-style: dashed;display: flex;align-items: center;color: #e2e2e2;font-size: 14px;line-height: 20px;border-color: #e2e2e2;border-width: 0; }.separator::bef…

leetcode4.寻找两个正序数组中的中位数

思路源于 LeetCode004-两个有序数组的中位数-最优算法代码讲解 基本思路是将两个数组看成一个数组&#xff0c;然后划分为两个部分&#xff0c;若为奇数左边部分个数多1&#xff0c;若为偶数左边部分等于右边部分个数。i表示数组1划分位置&#xff08;i为4是索引4也表示i的左半…

0101安装matplotlib_numpy_pandas-报错-python

文章目录 1 前言2 报错报错1&#xff1a;ModuleNotFoundError: No module named distutils报错2&#xff1a;ERROR:root:code for hash blake2b was not found.报错3&#xff1a;**ModuleNotFoundError: No module named _tkinter**报错4&#xff1a;UserWarning: Glyph 39044 …

OSCP - Proving Grounds- SoSimple

主要知识点 wordpress 插件RCE漏洞sudo -l shell劫持 具体步骤 依旧是nmap 起手&#xff0c;只发现了22和80端口&#xff0c;但80端口只能看到一张图 Nmap scan report for 192.168.214.78 Host is up (0.46s latency). Not shown: 65533 closed tcp ports (reset) PORT …

C语言求3到100之间的素数

一、代码展示 二、运行结果 三、感悟思考 注意: 这个题思路他是一个试除法的一个思路 先进入一个for循环 遍历3到100之间的数字 第二个for循环则是 判断他不是素数 那么就直接退出 这里用break 是素数就打印出来 在第一个for循环内 第二个for循环外

【2025】物联网发展趋势介绍

目录 物联网四层架构感知识别层网络构建层管理服务层——**边缘存储**边缘计算关键技术&#xff1a;综合应用层——信息应用 物联网四层架构 综合应用层&#xff1a;信息应用 利用获取的信息和知识&#xff0c;支持各类应用系统的运转 管理服务层&#xff1a;信息处理 对数据进…

如何查看 MySQL 的磁盘空间使用情况:从表级到数据库级的分析

在日常数据库管理中&#xff0c;了解每张表和每个数据库占用了多少磁盘空间是非常关键的。这不仅有助于我们监控数据增长&#xff0c;还能为性能优化提供依据。 Google Gemini中国版调用Google Gemini API&#xff0c;中国大陆优化&#xff0c;完全免费&#xff01;https://ge…

汇编学习之《移位指令》

这章节学习前需要回顾之前的标志寄存器的内容&#xff1a; 汇编学习之《标志寄存器》 算数移位指令 SAL (Shift Arithmetic Left)算数移位指令 : 左移一次&#xff0c;最低位用0补位&#xff0c;最高位放入EFL标志寄存器的CF位&#xff08;进位标志&#xff09; OllyDbg查看…

Nature Communications上交、西湖大学、复旦大学研发面向机器人多模式运动的去电子化刚弹耦合高频自振荡驱动单元

近年来&#xff0c;轻型仿生机器人因其卓越的运动灵活性与环境适应性受到国际机器人领域的广泛关注。然而&#xff0c;现有气动驱动器普遍受限于低模量粘弹性材料的回弹滞后效应与能量耗散特性&#xff0c;加之其"非刚即柔"的二元结构设计范式&#xff0c;难以同时满…

对备忘录模式的理解

对备忘录模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1095)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 2、理解需求 二、不采用备忘录设计模式1、代码2、问题3、错误的备忘录模式 三、采用备忘录设计模式1、代码1.1 …

【数据结构】图的基本概念

图的定义 通俗来说一堆顶点被一堆线连在一起&#xff0c;这一坨顶点与线的集合 目录 图的定义 术语 有向图与无向图 简单图与多重图 度、入度与出度 路径与回路 路径长度与距离 子图 连通、连通图与连通分量 强连通、强连通图与强连通分量 完全图 生成树与生成森林 权…

激光加工中平面倾斜度的矫正

在激光加工中&#xff0c;加工平面的倾斜度矫正至关重要&#xff0c;直接影响加工精度和材料处理效果。以下是系统的矫正方法和步骤&#xff1a; 5. 验证与迭代 二次测量&#xff1a;加工后重新检测平面度&#xff0c;确认残余误差。 反馈优化&#xff1a;根据误差分布修正补偿…

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…

PE结构(十五)系统调用与函数地址动态寻找

双机调试 当需要分析一个程序时&#xff0c;这个程序一定是可以调试的&#xff0c;操作系统也不例外。在调试过程中下断点是很重要的 当我们对一个应用程序下断点时&#xff0c;应用程序是挂起的。但当我们对操作系统的内核程序下断点时&#xff0c;被挂起的不是内核程序而是…

webrtc 本地运行的详细操作步骤 1

前言 选修课的一个课程设计&#xff0c;需要我们本地运行这个开源项目&#xff0c;给我的压力非常大&#xff0c;因为确实不是很熟练这种操作。但是还是得做。谨以此文&#xff0c;纪念这个过程。 之前自己在 github 上面看到有代码仓库&#xff0c;但是比较复杂&#xff0c;在…

kali——httrack

目录 前言 使用教程 前言 HTTrack 是一款运行于 Kali Linux 系统中的开源网站镜像工具&#xff0c;它能将网站的页面、图片、链接等资源完整地下载到本地&#xff0c;构建出一个和原网站结构相似的离线副本。 使用教程 apt install httrack //安装httrack工具 httrac…