《深入浅出C语言:从基础到指针的全面指南》

1. 简介

        C语言是一种通用的编程语言,广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发,并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称,是许多现代编程语言的基础。

2. 基本语法

2.1 Hello, World!程序
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
  • #include <stdio.h>:包含标准输入输出库。
  • int main():程序的主函数。
  • printf:输出函数,用于打印字符串。
  • return 0:返回0表示程序成功结束。
2.2 注释

        C语言支持单行注释和多行注释:

// 这是单行注释
/*
  这是多行注释
*/

3. 数据类型和变量

3.1 基本数据类型

        C语言有以下几种基本数据类型:

  • 整型(int)
  • 浮点型(float, double)
  • 字符型(char)
int a = 10;
float b = 5.5;
char c = 'A';
3.2 变量声明和初始化

        变量声明和初始化可以在同一行完成:

int x = 5;
float y = 3.14;
char z = 'A';
3.3 常量

        使用const关键字定义常量:

const int MAX = 100;
数据类型描述
int整型
float浮点型
double双精度浮点型
char字符型
const常量

4. 运算符

4.1 算术运算符

        C语言支持以下算术运算符:

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模
int a = 10, b = 3;
int sum = a + b;  // sum = 13
int diff = a - b; // diff = 7
int prod = a * b; // prod = 30
int quot = a / b; // quot = 3
int mod = a % b;  // mod = 1
4.2 关系运算符

        关系运算符用于比较两个值:

  • ==:等于
  • !=:不等于
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于
int x = 5, y = 10;
int result = (x == y); // result = 0 (false)
result = (x != y);     // result = 1 (true)
result = (x > y);      // result = 0 (false)
result = (x < y);      // result = 1 (true)
4.3 逻辑运算符

        逻辑运算符用于组合多个条件:

  • &&:逻辑与
  • ||:逻辑或
  • !:逻辑非
int a = 1, b = 0;
int result = (a && b); // result = 0 (false)
result = (a || b);     // result = 1 (true)
result = !a;           // result = 0 (false)
4.4 赋值运算符

        赋值运算符用于给变量赋值:

  • =:赋值
  • +=:加后赋值
  • -=:减后赋值
  • *=:乘后赋值
  • /=:除后赋值
  • %=:模后赋值
int a = 10;
a += 5;  // a = 15
a -= 3;  // a = 12
a *= 2;  // a = 24
a /= 4;  // a = 6
a %= 4;  // a = 2
4.5 位运算符

        位运算符用于操作二进制位:

  • &:按位与
  • |:按位或
  • ^:按位异或
  • ~:按位取反
  • <<:左移
  • >>:右移
int a = 5, b = 3; // a = 0101, b = 0011
int result = a & b; // result = 0001 (1)
result = a | b;     // result = 0111 (7)
result = a ^ b;     // result = 0110 (6)
result = ~a;        // result = 11111111111111111111111111111010 (-6)
result = a << 1;    // result = 1010 (10)
result = a >> 1;    // result = 0010 (2)
4.6 其他运算符
  • ? ::三元运算符
int a = 10, b = 20;
int max = (a > b) ? a : b; // max = 20
运算符描述
+, -, *, /, %算术运算符
==, !=, >, <, >=, <=关系运算符
&&,
=, +=, -=, *=, /=, %=赋值运算符
&,, ^, ~, <<, >>
? :三元运算符
4.7 综合示例
#include <stdio.h>

int main() {
    int a = 10, b = 20;
    int sum = a + b;
    int diff = a - b;
    int prod = a * b;
    int quot = a / b;
    int mod = a % b;

    if (a > b) {
        printf("a is greater than b\n");
    } else {
        printf("a is not greater than b\n");
    }

    int max = (a > b) ? a : b;
    printf("The maximum value is: %d\n", max);

    return 0;
}

5. 控制结构

5.1 条件语句
5.1.1 if语句
int x = 5;
if (x > 0) {
    printf("x is positive\n");
}
5.1.2 if-else语句
int x = -5;
if (x > 0) {
    printf("x is positive\n");
} else {
    printf("x is non-positive\n");
}
5.1.3 switch语句
int day = 3;
switch (day) {
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    default:
        printf("Invalid day\n");
}
5.2 循环语句

        循环语句允许重复执行某段代码,直到满足特定条件。C语言支持三种主要的循环语句:for循环、while循环和do-while循环。

5.2.1 for循环

   for循环通常用于需要明确知道循环次数的场景。

for (int i = 0; i < 5; i++) {
    printf("i = %d\n", i);
}
  • 初始化:int i = 0,在循环开始前执行。
  • 条件:i < 5,在每次循环前检查,如果条件为真,则执行循环体。
  • 迭代:i++,在每次循环结束后执行。
5.2.2 while循环

   while循环在每次迭代前检查条件,如果条件为真,则执行循环体。

int i = 0;
while (i < 5) {
    printf("i = %d\n", i);
    i++;
}
5.2.3 do-while循环

   do-while循环先执行循环体,然后再检查条件。如果条件为真,则继续循环。

int i = 0;
do {
    printf("i = %d\n", i);
    i++;
} while (i < 5);
循环类型描述
for适用于已知循环次数的情况
while适用于循环次数不确定,但需要在每次迭代前检查条件的情况
do-while适用于至少需要执行一次循环体的情况
5.3 跳转语句

        跳转语句用于改变程序的执行流程。C语言支持以下跳转语句:breakcontinuegoto

5.3.1 break

   break语句用于立即退出循环或switch语句。

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;
    }
    printf("i = %d\n", i);
}
5.3.2 continue

   continue语句用于跳过当前迭代,继续下一次循环。

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        continue;
    }
    printf("i = %d\n", i);
}
5.3.3 goto

   goto语句用于无条件跳转到程序中的指定标签。应谨慎使用goto,因为它可能导致代码难以理解和维护。

int i = 0;
start:
printf("i = %d\n", i);
i++;
if (i < 5) {
    goto start;
}
跳转语句描述
break立即退出循环或switch语句
continue跳过当前迭代,继续下一次循环
goto无条件跳转到指定标签
5.4 综合示例
#include <stdio.h>

int main() {
    // for 循环示例
    for (int i = 0; i < 5; i++) {
        printf("for loop: i = %d\n", i);
    }

    // while 循环示例
    int j = 0;
    while (j < 5) {
        printf("while loop: j = %d\n", j);
        j++;
    }

    // do-while 循环示例
    int k = 0;
    do {
        printf("do-while loop: k = %d\n", k);
        k++;
    } while (k < 5);

    // break 和 continue 示例
    for (int l = 0; l < 10; l++) {
        if (l == 5) {
            break; // 退出循环
        }
        if (l % 2 == 0) {
            continue; // 跳过当前迭代
        }
        printf("break and continue: l = %d\n", l);
    }

    return 0;
}

6. 函数

        函数是组织代码的一种方式,能够提高代码的重用性和可读性。C语言中的函数包括函数定义和函数声明。

6.1 函数的定义和声明

        函数定义包括函数的返回类型、函数名、参数列表和函数体。函数声明则是在函数使用前声明其类型和参数。

// 函数声明
int add(int x, int y);

// 函数定义
int add(int x, int y) {
    return x + y;
}

int main() {
    int result = add(3, 4);
    printf("Result: %d\n", result);
    return 0;
}
6.2 函数参数和返回值

        函数可以接受参数并返回值。参数在函数定义时指定,调用时传递。

int multiply(int a, int b) {
    return a * b;
}

int main() {
    int result = multiply(5, 6);
    printf("Result: %d\n", result);
    return 0;
}
6.3 递归函数

        递归函数是指一个函数在其定义中调用自身。递归需要一个终止条件,否则会导致无限递归。

int factorial(int n) {
    if (n == 0) {
        return 1;
    }
    return n * factorial(n - 1);
}

int main() {
    int result = factorial(5);
    printf("Factorial: %d\n", result);
    return 0;
}
6.4 函数指针

        函数指针是指向函数的指针,可以用来调用函数。

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*func_ptr)(int, int) = add;
    int result = func_ptr(3, 4);
    printf("Result: %d\n", result);
    return 0;
}
函数类型描述
普通函数定义和声明函数,接受参数并返回值
递归函数在函数定义中调用自身
函数指针指向函数的指针,用于调用函数
6.5 综合示例
#include <stdio.h>

// 函数声明
int add(int x, int y);
int multiply(int a, int b);
int factorial(int n);

// 函数定义
int add(int x, int y) {
    return x + y;
}

int multiply(int a, int b) {
    return a * b;
}

int factorial(int n) {
    if (n == 0) {
        return 1;
    }
    return n * factorial(n - 1);
}

int main() {
    int sum = add(3, 4);
    int product = multiply(5, 6);
    int fact = factorial(5);

    printf("Sum: %d\n", sum);
    printf("Product: %d\n", product);
    printf("Factorial: %d\n", fact);

    // 函数指针
    int (*func_ptr)(int, int) = add;
    int result = func_ptr(7, 8);
    printf("Function pointer result: %d\n", result);

    return 0;
}

7. 数组

        数组是存储相同类型数据的集合。C语言支持一维数组和多维数组。

7.1 一维数组

        一维数组是最简单的数组形式,用于存储一组相同类型的数据。

int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    printf("arr[%d] = %d\n", i, arr[i]);
}
7.2 多维数组

        多维数组是数组的数组,可以用于存储更复杂的数据结构。

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
    }
}
7.3 字符串(字符数组)

        字符串在C语言中表示为字符数组,以空字符\0结尾。

char str[] = "Hello, World!";
printf("%s\n", str);
7.4 数组与指针的关系

        数组名实际上是一个指向数组首元素的指针。

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;  // 数组名即为数组首元素的地址
for (int i = 0; i < 5; i++) {
    printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
}
数组类型描述
一维数组存储一组相同类型的数据
多维数组数组的数组,用于存储更复杂的数据结构
字符串字符数组,以空字符\0结尾
数组与指针数组名是指向数组首元素的指针
7.5 综合示例
#include <stdio.h>

int main() {
    // 一维数组示例
    int arr[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    // 多维数组示例
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
        }
    }

    // 字符串示例
    char str[] = "Hello, World!";
    printf("%s\n", str);

    // 数组与指针的关系示例
    int *p = arr;  // 数组名即为数组首元素的地址
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
    }

    return 0;
}

8. 指针

        指针是C语言中非常重要的概念,用于存储变量的地址。指针的灵活性和强大功能使其在C语言编程中广泛应用。

8.1 指针的基本概念

        指针是一个变量,其值为另一个变量的地址。

int a = 10;
int *p = &a;  // p是一个指针,存储了变量a的地址
printf("a = %d, *p = %d\n", a, *p);  // *p表示指针p指向的变量的值
8.2 指针的声明和初始化

        指针的声明和初始化如下:

int a = 10;
int *p = &a;  // 声明一个指向int类型的指针,并初始化为变量a的地址
8.3 指针运算

        指针可以进行加减运算和比较运算。

  • 指针加减运算
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
p = p + 2;  // 指针指向第三个元素
printf("*p = %d\n", *p);  // 输出3
  • 指针比较运算
int *p1 = arr;
int *p2 = arr + 2;
if (p1 < p2) {
    printf("p1 points to an earlier element than p2\n");
}
8.4 指针与数组

指针和数组有着密切的关系,数组名实际上是一个指向数组首元素的指针。

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;  // 数组名即为数组首元素的地址
for (int i = 0; i < 5; i++) {
    printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
}
8.5 函数中的指针参数

指针可以作为函数参数传递,允许函数修改调用者的变量。

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 10, y = 20;
    swap(&x, &y);
    printf("x = %d, y = %d\n", x, y);  // 输出x = 20, y = 10
    return 0;
}
8.6 指向指针的指针

指针不仅可以指向普通变量,还可以指向其他指针。

int a = 10;
int *p = &a;
int **pp = &p;  // pp是一个指向指针p的指针
printf("a = %d, *p = %d, **pp = %d\n", a, *p, **pp);
8.7 动态内存分配

C语言提供了一组函数用于动态分配和释放内存。

  • malloc:分配指定字节数的内存
  • calloc:分配指定数量的内存块,并初始化为零
  • realloc:重新分配内存
  • free:释放内存
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 使用malloc分配内存
    int *arr = (int *)malloc(5 * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }

    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    // 释放内存
    free(arr);

    return 0;
}
指针类型描述
普通指针存储变量的地址
指向指针的指针存储指针的地址
动态内存分配使用malloccallocreallocfree进行内
8.8 综合示例
#include <stdio.h>
#include <stdlib.h>

// 函数声明
void swap(int *a, int *b);

int main() {
    // 指针基本操作
    int a = 10;
    int *p = &a;
    printf("a = %d, *p = %d\n", a, *p);

    // 指针运算
    int arr[5] = {1, 2, 3, 4, 5};
    p = arr;
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
    }

    // 函数中的指针参数
    int x = 10, y = 20;
    swap(&x, &y);
    printf("x = %d, y = %d\n", x, y);

    // 指向指针的指针
    int **pp = &p;
    printf("a = %d, *p = %d, **pp = %d\n", a, *p, **pp);

    // 动态内存分配
    int *dynamicArr = (int *)malloc(5 * sizeof(int));
    if (dynamicArr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    for (int i = 0; i < 5; i++) {
        dynamicArr[i] = i + 1;
    }
    for (int i = 0; i < 5; i++) {
        printf("dynamicArr[%d] = %d\n", i, dynamicArr[i]);
    }
    free(dynamicArr);

    return 0;
}

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

结论

        本文详细介绍了C语言的基础知识,从基本语法、变量、控制结构、函数、数组一直到指针。通过代码示例和表格总结,帮助你更好地理解各个知识点。希望这些内容能够为你打下坚实的基础,进一步深入学习C语言。

综合示例

#include <stdio.h>
#include <stdlib.h>

// 函数声明
// add 函数用于返回两个整数的和
int add(int x, int y);

// swap 函数用于交换两个整数的值
void swap(int *a, int *b);

// factorial 函数用于计算一个整数的阶乘
int factorial(int n);

// printArray 函数用于打印数组的内容
void printArray(int *arr, int size);

// initializeMatrix 函数用于初始化一个2x3的矩阵
void initializeMatrix(int matrix[2][3]);

int main() {
    // 基本数据类型和变量
    int a = 10;          // 整型变量
    float b = 5.5;       // 浮点型变量
    char c = 'A';        // 字符型变量
    const int MAX = 100; // 常量,值不可改变

    // 算术运算符和关系运算符的使用
    int sum = add(a, 5); // 调用 add 函数计算 a 和 5 的和
    if (sum > MAX) {     // 使用关系运算符比较 sum 和 MAX
        printf("Sum is greater than MAX\n");
    } else {
        printf("Sum is less than or equal to MAX\n");
    }

    // 逻辑运算符
    if (a > 0 && b > 0) { // 使用逻辑运算符检查 a 和 b 是否都为正数
        printf("a and b are positive\n");
    }

    // 控制结构
    // 条件语句
    if (a > 0) {                   // if 语句检查条件是否为真
        printf("a is positive\n");
    } else if (a == 0) {           // else if 语句检查另一个条件
        printf("a is zero\n");
    } else {                       // else 语句处理所有其他情况
        printf("a is negative\n");
    }

    // switch 语句
    switch (c) {                   // 根据变量 c 的值执行相应的 case 语句
        case 'A':
            printf("Character is A\n");
            break;                 // break 语句用于退出 switch 语句
        case 'B':
            printf("Character is B\n");
            break;
        default:                   // default 语句处理所有未匹配的情况
            printf("Character is not A or B\n");
    }

    // 循环语句
    // for 循环
    for (int i = 0; i < 5; i++) {  // for 循环用于重复执行代码块,直到条件为假
        printf("for loop: i = %d\n", i);
    }

    // while 循环
    int j = 0;
    while (j < 5) {                // while 循环在每次迭代前检查条件
        printf("while loop: j = %d\n", j);
        j++;
    }

    // do-while 循环
    int k = 0;
    do {                           // do-while 循环先执行代码块,然后检查条件
        printf("do-while loop: k = %d\n", k);
        k++;
    } while (k < 5);

    // 跳转语句
    for (int l = 0; l < 10; l++) {
        if (l == 5) {
            break; // 退出循环
        }
        if (l % 2 == 0) {
            continue; // 跳过当前迭代
        }
        printf("break and continue: l = %d\n", l);
    }

    // 数组和指针
    int arr[5] = {1, 2, 3, 4, 5};  // 定义一个包含5个整数的一维数组
    printArray(arr, 5);            // 调用 printArray 函数打印数组内容

    // 函数中的指针参数
    int x = 10, y = 20;
    swap(&x, &y);                  // 调用 swap 函数交换 x 和 y 的值
    printf("After swap: x = %d, y = %d\n", x, y);

    // 递归函数
    int fact = factorial(5);       // 调用 factorial 函数计算 5 的阶乘
    printf("Factorial of 5: %d\n", fact);

    // 多维数组
    int matrix[2][3];              // 定义一个2x3的二维数组
    initializeMatrix(matrix);      // 调用 initializeMatrix 函数初始化矩阵
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
        }
    }

    // 字符串
    char str[] = "Hello, World!";  // 定义一个字符串(字符数组)
    printf("%s\n", str);

    // 动态内存分配
    int *dynamicArr = (int *)malloc(5 * sizeof(int)); // 使用 malloc 分配内存
    if (dynamicArr == NULL) {       // 检查内存分配是否成功
        printf("Memory allocation failed\n");
        return 1;
    }
    for (int i = 0; i < 5; i++) {
        dynamicArr[i] = i + 1;      // 初始化动态数组
    }
    printArray(dynamicArr, 5);      // 打印动态数组内容
    free(dynamicArr);               // 释放动态分配的内存

    return 0;
}

// 函数定义
int add(int x, int y) {
    // 返回两个整数的和
    return x + y;
}

void swap(int *a, int *b) {
    // 交换两个整数的值
    int temp = *a;
    *a = *b;
    *b = temp;
}

int factorial(int n) {
    // 递归计算整数 n 的阶乘
    if (n == 0) {
        return 1;
    }
    return n * factorial(n - 1);
}

void printArray(int *arr, int size) {
    // 打印数组的内容
    for (int i = 0; i < size; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
}

void initializeMatrix(int matrix[2][3]) {
    // 初始化一个2x3的矩阵
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            matrix[i][j] = i * 3 + j + 1; // 按顺序赋值
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

44-4 waf绕过 - CDN简介

一、CDN简介 CDN,即内容分发网络(Content Delivery Network),是建立在现有网络基础之上的智能虚拟网络。它依靠部署在各地的边缘服务器,并通过中心平台的负载均衡、内容分发和调度等功能模块,使用户可以就近获取所需内容,从而降低网络拥塞,提高用户访问响应速度和命中率…

servlet小项目与servlet续集

文章目录 servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能新增操作修改操作删除操作过滤器Cookie servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能 上一…

Spring boot集成通义千问大模型实现智能问答

Spring boot集成通义千问大模型实现智能问答 背景 我在用idea进行java开发时发现了通义灵码这款免费的智能代码补全插件&#xff0c;用了一段时间了&#xff0c;感觉很不错。就想着在自己的项目中也能集成通义千问大模型实现智能回答&#xff0c;毕竟对接openai需要解决网络问…

社交媒体数据恢复:Weico

一、从备份中恢复数据 云备份 希望这篇教程能帮助你恢复Weico中的聊天记录和文件。如有其他问题&#xff0c;请随时联系我们。 三、注意事项 在尝试恢复数据的过程中&#xff0c;请避免执行任何可能导致数据进一步丢失的操作。 数据恢复的效果取决于多种因素&#xff0c;包…

GPU的最佳拍档HBM到底是什么

在AI界&#xff0c;英伟达的大名无人不知&#xff0c;无人不晓。然而即使在AI芯片界占据绝对霸主地位的英伟达&#xff0c;依旧受制于人。 众所周知&#xff0c;算力与带宽是制衡AI应用的两大关键因素&#xff0c;长期以来高速发展的算力受困于有限的带宽限制了其性能的最大发…

信息系统项目管理师0142:管理新实践(9项目范围管理—9.1管理基础—9.1.2管理新实践)

点击查看专栏目录 文章目录 9.1.2 管理新实践 9.1.2 管理新实践 需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收益。随着全球项目环境变得日益复杂&#xff0…

【人工智能Ⅱ】实验8:生成对抗网络

实验8&#xff1a;生成对抗网络 一&#xff1a;实验目的 1&#xff1a;理解生成对抗网络的基本原理。 2&#xff1a;学会构建改进的生成对抗网络&#xff0c;如DCGAN、WGAN、WGAN-GP等。 3&#xff1a;学习在更为真实的数据集上应用生成对抗网络的方法。 二&#xff1a;实验…

Java反序列化-RMI流程分析

RMI 在反序列化里漏洞里面是很常用的&#xff0c;它是一个分布式的思想。 RMI概述 RMI 通常包含两个独立的程序&#xff0c;一个服务端 和 一个客户端。服务端通过绑定这个远程对象类&#xff0c;它可以封装网络操作。客户端层面上只需要传递一个名字&#xff0c;还有地址。 …

LNMP 环境下使用 Zstd 压缩优化网站备份脚本

网站的备份一直都是网站运营、服务器运维中很重要的一环&#xff0c;明月无论是在自己的服务器还是客户的代运维服务器上都是非常重视网站备份的&#xff0c;尤其热衷于优化网站备份这块儿&#xff0c;毕竟明月自己的服务器配置一直都是最低的 1H1G 呀&#xff0c;就这配置常年…

(函数)空格填充(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明空格填充函数&#xff1b; void space(char a[100]);int main() {//初始化变量值&#xff1b;char a[100] { 0 };//获取用户输入的数据&#xff1b;print…

人工智能学习笔记(1):了解sklearn

sklearn 简介 Sklearn是一个基于Python语言的开源机器学习库。全称Scikit-Learn&#xff0c;是建立在诸如NumPy、SciPy和matplotlib等其他Python库之上&#xff0c;为用户提供了一系列高质量的机器学习算法&#xff0c;其典型特点有&#xff1a; 简单有效的工具进行预测数据分…

Kafka生产者消息异步发送并返回发送信息api编写教程

1.引入依赖&#xff08;pox.xml文件&#xff09; <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.2</version> </dependency> </depende…

泰中完成潜艇采购谈判:有三个亮点值得关注

泰中完成潜艇采购谈判&#xff1a;有三个亮点值得关注 --如何写好产品采购制造类合同&#xff08;或协议&#xff09;才能有效维护你的利益 据新华网消息&#xff1a;泰国和中国已经完成关于泰国皇家海军购买中国制造的S26T元级潜艇的谈判。这份交易正在等待内阁的最终批准。…

WALT算法简介

WALT(Windows-Assist Load Tracing)算法是由Qcom开发&#xff0c; 通过把时间划分为窗口&#xff0c;对 task运行时间和CPU负载进行跟踪计算的方法。为任务调度、迁移、负载均衡及CPU调频 提供输入。 WALT相对PELT算法&#xff0c;更能及时反映负载变化&#xff0c; 更适用于…

黄金期货与现货黄金有什么区别?

如今&#xff0c;黄金成为了众多投资者的热门选择。在黄金投资市场中&#xff0c;有多种形式可供选择&#xff0c;比如纸黄金、实物黄金、黄金期货以及现货黄金等。其中&#xff0c;纸黄金和实物黄金虽然具有其特点&#xff0c;但所需资金量较大且收益表现相对不明显。相对而言…

哈希重要思想续——布隆过滤器

布隆过滤器 一 概念1.1布隆过滤器的提出2.概念 二 模拟实现2.1 三个仿函数setTest 全代码三 实际应用 一 概念 1.1布隆过滤器的提出 我们在使用新闻客户端看新闻时&#xff0c;它会给我们不停地推荐新的内容&#xff0c;它每次推荐时要去重&#xff0c;去掉那些已经看过的内容…

Java面试八股之守护线程和普通线程的区别

守护线程和普通线程的区别 生命周期差异&#xff1a; 普通线程&#xff08;也称为用户线程&#xff09;&#xff1a;这类线程的生命周期与程序的生命周期独立。它们会一直运行直到完成自己的任务或主动结束&#xff0c;如果一个程序中只剩下普通线程在运行&#xff0c;即使主…

JavaScript、Kotlin、Flutter可以开发鸿蒙APP吗?

自从去年华为宣布推出「鸿蒙Next」版本开始&#xff0c;标志着其操作系统的全面革新。鸿蒙Next将摒弃所有基于AOSP的代码&#xff0c;与Android系统彻底分离&#xff0c;实现完全自主的研发路径。通过精简约40%的冗余代码&#xff0c;鸿蒙Next致力于构建一个更高效、更流畅的系…

混合动力电动汽车介绍(二)

接续前一章内容&#xff0c;本篇文章介绍混合动力汽车串联、并联和混联的系统组成和工作原理。 一、串联混合动力电动汽车的系统组成和工作原理 上图为串联混合动力电动汽车的结构简图。汽车由电动机-发电机驱动行驶&#xff0c;电机控制器的动力来自油箱-发动机-发电机-发电机…

Python画图(多图展示在一个平面)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…